Files
2026-10-28 17:27:22 +07:00

233 lines
6.0 KiB
JavaScript

(function () {
// 弹窗广告队列结束(含没有 / 已关闭过)后通知九宫格弹窗:年龄确认 → 弹窗广告 → 九宫格
function markDone() {
if (window.__dialogAdDone) return;
window.__dialogAdDone = true;
document.dispatchEvent(new CustomEvent("dialogad:done"));
}
var QUEUE_VERSION = "2";
var DISMISSED_KEY = "dialogAdDismissed";
var PROGRESS_KEY = "dialogAdProgress";
var mask = document.querySelector("[data-dialog-ad]");
var previousBodyOverflow = "";
var hasDisplayedItem = false;
if (!mask) return markDone();
var items = Array.prototype.slice.call(mask.querySelectorAll("[data-dialog-ad-item]"));
if (!items.length) return markDone();
var queueSignature =
QUEUE_VERSION +
"|" +
items
.map(function (item, index) {
var image = item.querySelector(".dialog-ad-image");
return (
item.getAttribute("data-dialog-ad-id") ||
(image && image.getAttribute("data-dialog-ad-src")) ||
String(index)
);
})
.join("|");
function readSession(key) {
try {
return window.sessionStorage.getItem(key) || "";
} catch (error) {
return "";
}
}
function writeSession(key, value) {
try {
window.sessionStorage.setItem(key, value);
} catch (error) {
// sessionStorage 被禁用时仍允许本页依次展示和关闭广告。
}
}
function removeSession(key) {
try {
window.sessionStorage.removeItem(key);
} catch (error) {
// sessionStorage 被禁用时无需清理。
}
}
function isDismissed() {
return readSession(DISMISSED_KEY) === queueSignature;
}
function readProgress() {
try {
var progress = JSON.parse(readSession(PROGRESS_KEY));
if (!progress || progress.signature !== queueSignature) return 0;
var value = Number(progress.index);
if (!Number.isFinite(value) || value < 0) return 0;
return Math.floor(value);
} catch (error) {
return 0;
}
}
function rememberProgress(index) {
writeSession(
PROGRESS_KEY,
JSON.stringify({ signature: queueSignature, index: index }),
);
}
var currentIndex = readProgress();
function hideAllItems() {
items.forEach(function (item) {
item.hidden = true;
item.setAttribute("hidden", "");
});
}
function setActiveItem(index) {
hideAllItems();
var item = items[index];
if (!item) return false;
item.hidden = false;
item.removeAttribute("hidden");
return true;
}
function openMask() {
if (isDismissed()) return;
if (!mask.classList.contains("is-open")) {
previousBodyOverflow = document.body.style.overflow;
mask.hidden = false;
mask.removeAttribute("hidden");
mask.classList.add("is-open");
document.body.style.overflow = "hidden";
}
}
function finishQueue() {
if (hasDisplayedItem) {
writeSession(DISMISSED_KEY, queueSignature);
} else {
removeSession(DISMISSED_KEY);
}
removeSession(PROGRESS_KEY);
hideAllItems();
mask.classList.remove("is-open");
mask.hidden = true;
mask.setAttribute("hidden", "");
document.body.style.overflow = previousBodyOverflow === "hidden" ? "" : previousBodyOverflow;
markDone();
}
function showWhenAgeGateAllows() {
if (isDismissed()) return;
var ageGate = document.getElementById("eightPop");
if (ageGate && ageGate.classList.contains("is-open")) {
document.addEventListener("eightpop:closed", openMask, { once: true });
return;
}
openMask();
}
function waitForImage(image) {
return new Promise(function (resolve, reject) {
if (image.complete) {
if (image.naturalWidth > 0) resolve();
else reject(new Error("image decode failed"));
return;
}
var timeout = window.setTimeout(function () {
cleanup();
reject(new Error("image load timeout"));
}, 12000);
function cleanup() {
window.clearTimeout(timeout);
image.removeEventListener("load", handleLoad);
image.removeEventListener("error", handleError);
}
function handleLoad() {
cleanup();
if (image.naturalWidth > 0) resolve();
else reject(new Error("image decode failed"));
}
function handleError() {
cleanup();
reject(new Error("image load failed"));
}
image.addEventListener("load", handleLoad, { once: true });
image.addEventListener("error", handleError, { once: true });
});
}
function loadDialogImage(image) {
var source = image.getAttribute("data-dialog-ad-src") || "";
if (!source) return Promise.reject(new Error("image source is empty"));
if (typeof window.processImage === "function") {
return window.processImage(source, image).then(function (result) {
if (!result) throw new Error("image decrypt failed");
return waitForImage(image);
});
}
image.src = source;
return waitForImage(image);
}
function showItem(index) {
if (index >= items.length) {
finishQueue();
return;
}
currentIndex = index;
rememberProgress(currentIndex);
var item = items[currentIndex];
var image = item.querySelector(".dialog-ad-image");
function displayItem() {
if (!setActiveItem(currentIndex)) return;
hasDisplayedItem = true;
showWhenAgeGateAllows();
}
function skipBrokenItem() {
showItem(currentIndex + 1);
}
if (!image) return skipBrokenItem();
loadDialogImage(image).then(displayItem).catch(skipBrokenItem);
}
function showNextItem() {
showItem(currentIndex + 1);
}
mask.addEventListener("click", function (event) {
if (event.target.closest("[data-dialog-ad-close]")) {
showNextItem();
}
});
document.addEventListener("keydown", function (event) {
if (event.key === "Escape" && mask.classList.contains("is-open")) {
showNextItem();
}
});
if (isDismissed()) return markDone();
if (currentIndex >= items.length) {
finishQueue();
return;
}
showItem(currentIndex);
})();