Files
acai-vscode-webbase/template/estandar/js/async.js

218 lines
5.3 KiB
JavaScript
Executable File
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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);
});