54 lines
1.9 KiB
JavaScript
54 lines
1.9 KiB
JavaScript
/**
|
||
* 广告点击上报:POST /api/app/ads/click(本站 Go 服务代理到上游,appId 由服务端固定为 12)。
|
||
* - 广告元素由服务端模板输出 data-ads-id / data-ads-location,ID 无效时不输出,即不上报
|
||
* - document 捕获阶段监听 click 与 auxclick(中键),不阻止默认行为、不影响广告链接打开
|
||
* - 不依赖 request.js(导航页未加载),失败静默
|
||
*/
|
||
(function () {
|
||
if (window.__adClickBound) return;
|
||
window.__adClickBound = true;
|
||
|
||
var ENDPOINT = "/api/app/ads/click";
|
||
|
||
function positiveInt(value) {
|
||
var text = String(value == null ? "" : value).trim();
|
||
if (!/^\d+$/.test(text)) return 0;
|
||
var number = Number(text);
|
||
return Number.isSafeInteger(number) && number > 0 ? number : 0;
|
||
}
|
||
|
||
function payloadFrom(target) {
|
||
if (!target || typeof target.closest !== "function") return null;
|
||
var el = target.closest("[data-ads-id]");
|
||
if (!el) return null;
|
||
var adsId = positiveInt(el.getAttribute("data-ads-id"));
|
||
var location = positiveInt(el.getAttribute("data-ads-location"));
|
||
return adsId && location ? { adsId: adsId, location: location } : null;
|
||
}
|
||
|
||
function report(payload) {
|
||
try {
|
||
fetch(ENDPOINT, {
|
||
method: "POST",
|
||
headers: { "Content-Type": "application/json", Accept: "application/json" },
|
||
body: JSON.stringify(payload),
|
||
credentials: "same-origin",
|
||
keepalive: true,
|
||
}).catch(function () {});
|
||
} catch (error) {
|
||
// 上报失败不影响广告跳转。
|
||
}
|
||
}
|
||
|
||
function onClick(event) {
|
||
if (event.type === "auxclick" && event.button !== 1) return;
|
||
var target = event.target;
|
||
if (target && target.nodeType !== 1) target = target.parentElement;
|
||
var payload = payloadFrom(target);
|
||
if (payload) report(payload);
|
||
}
|
||
|
||
document.addEventListener("click", onClick, true);
|
||
document.addEventListener("auxclick", onClick, true);
|
||
})();
|