Initial commit: plantilla base PHP para webs Acai CMS
This commit is contained in:
218
template/estandar/js/async.js
Executable file
218
template/estandar/js/async.js
Executable file
@@ -0,0 +1,218 @@
|
||||
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);
|
||||
});
|
||||
Reference in New Issue
Block a user