Files
web_huangguo2_h5/app/static/js/pages/dialogAd.js
T
2026-10-28 17:40:27 +07:00

252 lines
6.8 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();
var displayedIndex = -1;
var loadGeneration = 0;
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";
}
var item = displayedIndex >= 0 ? items[displayedIndex] : null;
if (item && !item.__dialogAdShowTracked) {
item.__dialogAdShowTracked = true;
}
}
function finishQueue() {
loadGeneration += 1;
displayedIndex = -1;
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.querySelector("[data-eighteen]");
if (ageGate && ageGate.classList.contains("is-open")) {
document.addEventListener("eighteen: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;
displayedIndex = -1;
var generation = ++loadGeneration;
rememberProgress(currentIndex);
hideAllItems();
var item = items[index];
var image = item.querySelector(".dialog-ad-image");
function displayItem() {
if (loadGeneration !== generation || currentIndex !== index) return;
if (!setActiveItem(index)) return;
displayedIndex = index;
hasDisplayedItem = true;
showWhenAgeGateAllows();
}
function skipBrokenItem() {
if (loadGeneration !== generation || currentIndex !== index) return;
showItem(index + 1);
}
if (!image) return skipBrokenItem();
loadDialogImage(image).then(displayItem).catch(skipBrokenItem);
}
function showNextItem() {
var index = displayedIndex >= 0 ? displayedIndex : currentIndex;
showItem(index + 1);
}
mask.addEventListener("click", function (event) {
var item = event.target.closest("[data-dialog-ad-item]");
if (!item || item.hidden || !mask.contains(item)) return;
var index = items.indexOf(item);
if (index < 0 || index !== displayedIndex) return;
if (event.target.closest("[data-dialog-ad-close]")) {
showItem(index + 1);
}
});
document.addEventListener("keydown", function (event) {
if (event.key === "Escape" && mask.classList.contains("is-open") && displayedIndex >= 0) {
showNextItem();
}
});
if (isDismissed()) return markDone();
if (currentIndex >= items.length) {
finishQueue();
return;
}
showItem(currentIndex);
})();