218 lines
5.3 KiB
JavaScript
Executable File
218 lines
5.3 KiB
JavaScript
Executable File
var FunctionList = function() {
|
||
this._always = [];
|
||
this._stack = [];
|
||
}
|
||
|
||
FunctionList.prototype.add = function(f) {
|
||
if (!f || !(f instanceof Function)) return;
|
||
this._stack.push(f);
|
||
}
|
||
FunctionList.prototype.call = function() {
|
||
for (var i = 0; i < this._always.length; i++) {
|
||
this._always[i]();
|
||
}
|
||
for (var i = 0; i < this._stack.length; i++) {
|
||
this._stack[i]();
|
||
}
|
||
}
|
||
FunctionList.prototype.always = function(f) {
|
||
if (!f || !(f instanceof Function)) return;
|
||
this._always.push(f);
|
||
}
|
||
FunctionList.prototype.clear = function() {
|
||
this._stack.length = 0;
|
||
}
|
||
|
||
window.__main = new FunctionList();
|
||
|
||
/******/
|
||
|
||
function removeEventListeners(el) {
|
||
elClone = el.cloneNode(true);
|
||
el.parentNode.replaceChild(elClone, el);
|
||
return elClone;
|
||
}
|
||
var _blacklist = ['tel', '#', 'mailto', 'javascript'];
|
||
var firstTime = true;
|
||
var TRANSITION_DURATION = 0.4;
|
||
|
||
function bindLinks() {
|
||
if (!firstTime) {
|
||
$(window).off('scroll');
|
||
$(document).unbind('click');
|
||
}
|
||
var _links = document.querySelectorAll('a');
|
||
Array.from(_links).forEach(function(link) {
|
||
if (!firstTime) {
|
||
link = removeEventListeners(link);
|
||
}
|
||
if (validLink(link)) {
|
||
link.removeEventListener('click', bindLink);
|
||
link.addEventListener('click', bindLink);
|
||
}
|
||
});
|
||
if (firstTime) {
|
||
firstTime = false;
|
||
}
|
||
}
|
||
|
||
bindLinks();
|
||
|
||
function validLink(link) {
|
||
var href = link.hash || link.getAttribute('href');
|
||
if (!href) return false;
|
||
var target = link.target || link.getAttribute('target');
|
||
|
||
for (var i = 0; i < _blacklist.length; i++) {
|
||
if (href.startsWith(_blacklist[i])) {
|
||
return false;
|
||
}
|
||
}
|
||
|
||
if (href.startsWith('http') && !href.includes(window.location.hostname) || target || link.getAttribute('data-rel')) {
|
||
return false;
|
||
}
|
||
return true;
|
||
}
|
||
|
||
function bindLink(e) {
|
||
var menuObject = this;
|
||
var href = this.hash || this.getAttribute('href');
|
||
e.preventDefault();
|
||
sendRequest(menuObject, href);
|
||
}
|
||
|
||
function sendRequest(menuObject, href, fromPop) {
|
||
|
||
var mainTagAux = document.querySelector('main');
|
||
if (mainTagAux) {
|
||
mainTagAux.style.transition = 'all ' + TRANSITION_DURATION + 's';
|
||
mainTagAux.style.opacity = 0;
|
||
mainTagAux.style.transform = 'scale(0.9)';
|
||
mainTagAux.style.transformOrigin = 'top center';
|
||
}
|
||
|
||
var request = new XMLHttpRequest();
|
||
request.open('GET', href, true);
|
||
|
||
if (typeof window.__main !== 'undefined') {
|
||
window.__main.clear();
|
||
}
|
||
|
||
request.onload = function() {
|
||
if (request.status >= 200 && request.status < 400) {
|
||
var data = request.responseText;
|
||
var parser = new DOMParser();
|
||
var doc = parser.parseFromString(data, 'text/html');
|
||
var mainTag = doc.querySelector('main');
|
||
var bodyTag = doc.querySelector('body');
|
||
var titleTag = doc.querySelector('title');
|
||
|
||
if (titleTag) {
|
||
document.title = titleTag.innerHTML;
|
||
}
|
||
|
||
if (!mainTag) {
|
||
window.location.href = href;
|
||
return;
|
||
}
|
||
|
||
var navbar = _checkIfLinkBelongsToMenu(menuObject);
|
||
|
||
if (navbar) {
|
||
var active = navbar.querySelector('.active');
|
||
if (active) active.classList.remove('active');
|
||
menuObject.parentNode.classList.add('active');
|
||
}
|
||
|
||
if (!fromPop) history.pushState({id: Date.now(), link: href}, null, href);
|
||
|
||
if (bodyTag) {
|
||
document.body.classList = bodyTag.classList;
|
||
}
|
||
|
||
var mainContainer = document.querySelector('main');
|
||
if (mainContainer) {
|
||
mainContainer.parentNode.replaceChild(mainTag, mainContainer);
|
||
mainTag.setAttribute('style', mainContainer.getAttribute('style'));
|
||
setTimeout(function() {
|
||
mainTag.style.opacity = 1;
|
||
mainTag.style.transform = 'scale(1)';
|
||
setTimeout(function() {
|
||
mainTag.removeAttribute('style');
|
||
}, TRANSITION_DURATION*1000);
|
||
}, 100);
|
||
bindLinks();
|
||
}
|
||
|
||
|
||
if (typeof window.__main !== 'undefined') {
|
||
var scripts = mainTag.querySelectorAll('script');
|
||
if (scripts) {
|
||
scripts.forEach(function(script) {
|
||
if (!script.src) {
|
||
window.__main.add(function() {
|
||
eval(script.innerHTML);
|
||
});
|
||
}
|
||
});
|
||
}
|
||
window.__main.call();
|
||
}
|
||
|
||
var scripts = document.querySelectorAll('script[src]');
|
||
if (scripts) {
|
||
scripts.forEach(function(script) {
|
||
var cloned = document.createElement('script');
|
||
cloned.defer = script.defer;
|
||
cloned.async = script.async;
|
||
var cache = script.getAttribute('data-cache');
|
||
if (cache !== null && cache !== undefined) {
|
||
return true;
|
||
}
|
||
cloned.src = script.src.replace(/([?&]?)(t=)([\d]+)/, '');
|
||
if (cloned.src.includes('?')) {
|
||
cloned.src += '&t=' + Date.now();
|
||
}else{
|
||
cloned.src += '?t=' + Date.now();
|
||
}
|
||
var parent = script.parentNode;
|
||
script.parentNode.removeChild(script);
|
||
parent.appendChild(cloned);
|
||
});
|
||
}
|
||
|
||
window.scrollTo(0,0);
|
||
var hamburger = document.querySelector('.navbar-toggle[aria-expanded="true"]');
|
||
if (hamburger) hamburger.click();
|
||
} else {
|
||
window.location.href = href;
|
||
}
|
||
|
||
};
|
||
|
||
request.onerror = function() {
|
||
window.location.href = href;
|
||
};
|
||
|
||
request.send();
|
||
}
|
||
|
||
function _checkIfLinkBelongsToMenu(link) {
|
||
if (!link) return false;
|
||
var tag = link;
|
||
while (tag && tag.tagName.toLowerCase() !== 'body') {
|
||
tag = tag.parentNode;
|
||
}
|
||
return tag;
|
||
}
|
||
|
||
window.addEventListener('popstate', function(e) {
|
||
console.log(e);
|
||
//window.location.reload();
|
||
if (!e.state || !e.state.link){
|
||
window.location.reload();
|
||
return;
|
||
}
|
||
sendRequest(null, e.state.link, true);
|
||
}); |