(function () { var WAIT_MS = 10000; // durata avviso e blocco click ripetuti var busy = false; function isDownload(url) { url = String(url || ""); return /\/nodes\/[^\/]+\/content/.test(url) && /[?&](attachment|a)=true/.test(url); } function banner(msg) { var el = document.getElementById("dl-banner"); if (!el) { el = document.createElement("div"); el.id = "dl-banner"; el.style.cssText = "position:fixed;top:12px;left:50%;transform:translateX(-50%);" + "background:#333;color:#fff;padding:10px 20px;border-radius:4px;" + "font:14px sans-serif;z-index:100000;box-shadow:0 2px 8px rgba(0,0,0,.4)"; document.body.appendChild(el); } el.textContent = msg; el.style.display = "block"; } function lock() { busy = true; document.body.style.cursor = "progress"; banner("Downloading ... attendere prego"); setTimeout(function () { busy = false; document.body.style.cursor = ""; var el = document.getElementById("dl-banner"); if (el) { el.style.display = "none"; } }, WAIT_MS); } // 1) anchor.click() chiamato da codice var origClick = HTMLAnchorElement.prototype.click; HTMLAnchorElement.prototype.click = function () { if (isDownload(this.href)) { if (busy) { return; } lock(); } return origClick.apply(this, arguments); }; // 2) anchor.dispatchEvent(new MouseEvent('click')) chiamato da codice var origDispatch = EventTarget.prototype.dispatchEvent; EventTarget.prototype.dispatchEvent = function (ev) { if (ev && ev.type === "click" && this instanceof HTMLAnchorElement && isDownload(this.href)) { if (busy) { return false; } lock(); } return origDispatch.apply(this, arguments); }; // 3) click reale dell'utente su un link (solo eventi "trusted", per non contare due volte) document.addEventListener("click", function (e) { if (!e.isTrusted) { return; } var a = e.target.closest && e.target.closest("a"); if (a && isDownload(a.href)) { if (busy) { e.preventDefault(); e.stopPropagation(); return; } lock(); } }, true); })();