- 删除 AksrtFrontend registry/rehydrate 双路架构及 build/public.js 拼包入口,
前台唯一初始路径为 PHP 本地栈(jQuery 1.9.1 → Bootstrap 3.4.1)
→ loader_js(_win/aksrtData 唯一注入)→ tbquire(['main']) → runtime/main.min.js
- window.auto_fun = debounce(z_auto_fun, 100) 为唯一重扫入口;所有模块改为
执行一次 + off/on('auto_fun.aksrt-*') 命名空间重扫,data/class 标记幂等
- 局部更新协议统一:HTML 注入 → post_ajax.ed → auto_fun();
远程 modal → loaded.bs.modal → auto_fun();JSON 成功 → zib_ajax.success
- 灯箱恢复 Miniimgbox/imgbox 唯一 owner(imgbox-container、a[data-imgbox]、
imgbox_data),删除 AksrtLightbox/data-aksrt-lightbox 第二实现及 CSS/overlay,
_win.imgbox* 重新接上 post-display 设置
- 死代码清理:runtime 下 11 组被自有实现替代的旧模块副本、无消费 vendored 库、
顶层 grade.min.js、revenue.js、无调用方的 aksrt_get_win_runtime_config(),
以及 loader 中 16 条死 mapping
- PHP 入队改为本地栈 + loader_js,routed/widget/submit 依赖统一换绑;
用户卡片发布按钮恢复 nav_user_newposts_btn 设置门控
- 测试对齐:新增 frontend-lifecycle-contract,重写 navigation/lazyload/toast/
auth-source/comment/page-display/post-visual 等断言为目标架构契约
验证:node --test widget-system+navigation 223 通过 0 失败;
构建脚本重建 main/imgbox min 与 CSS bundles;改动 PHP php -l、JS node --check
全部通过;git diff --check 干净;credits 重入 harness 通过。
92 lines
2.6 KiB
JavaScript
92 lines
2.6 KiB
JavaScript
/**
|
|
* AKSRT Site Notice — Popup notice with cookie-based frequency control
|
|
*
|
|
* Identity-based policy check is done server-side (PHP).
|
|
* JS only handles: show/hide animation, cookie dismissal, expiry.
|
|
*
|
|
* @package AKSRT
|
|
*/
|
|
|
|
(function () {
|
|
'use strict';
|
|
|
|
var el = document.getElementById('aksrt-site-notice');
|
|
if (!el) return;
|
|
|
|
// 弹窗周期(小时),0=永不过期
|
|
var expiresHours = parseInt(el.dataset.expires || '24', 10) || 0;
|
|
var cookieName = 'aksrt_notice_seen';
|
|
|
|
function getCookie(name) {
|
|
var match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));
|
|
return match ? decodeURIComponent(match[2]) : null;
|
|
}
|
|
|
|
function setCookie(name, value, days) {
|
|
var expires = '';
|
|
if (days) {
|
|
var date = new Date();
|
|
date.setTime(date.getTime() + days * 86400000);
|
|
expires = '; expires=' + date.toUTCString();
|
|
}
|
|
document.cookie = name + '=' + encodeURIComponent(value) + expires + '; path=/; SameSite=Lax';
|
|
}
|
|
|
|
function shouldShow() {
|
|
if (expiresHours === 0) return true; // 永不过期,总是显示
|
|
var seen = getCookie(cookieName);
|
|
if (!seen) return true;
|
|
var seenTs = parseInt(seen, 10);
|
|
if (!seenTs || seenTs <= 0) return true;
|
|
var now = Math.floor(Date.now() / 1000);
|
|
return (now - seenTs) >= (expiresHours * 3600);
|
|
}
|
|
|
|
function dismiss() {
|
|
// 写入当前时间戳
|
|
var days = expiresHours > 0 ? Math.ceil(expiresHours / 24) : 365;
|
|
setCookie(cookieName, String(Math.floor(Date.now() / 1000)), days);
|
|
close();
|
|
}
|
|
|
|
function close() {
|
|
el.style.opacity = '0';
|
|
setTimeout(function () {
|
|
el.style.display = 'none';
|
|
}, 300);
|
|
}
|
|
|
|
function show() {
|
|
el.style.display = '';
|
|
el.style.opacity = '0';
|
|
requestAnimationFrame(function () {
|
|
el.style.transition = 'opacity 0.3s';
|
|
el.style.opacity = '1';
|
|
});
|
|
}
|
|
|
|
// Bind events
|
|
var closeBtn = el.querySelector('.aksrt-site-notice__close');
|
|
var overlay = el.querySelector('.aksrt-site-notice__overlay');
|
|
// 所有 dismiss 按钮(包括 data-dismiss="notice" 的按钮和链接)
|
|
var dismissBtns = el.querySelectorAll('[data-dismiss="notice"]');
|
|
|
|
if (closeBtn) closeBtn.addEventListener('click', dismiss);
|
|
if (overlay) overlay.addEventListener('click', dismiss);
|
|
for (var i = 0; i < dismissBtns.length; i++) {
|
|
dismissBtns[i].addEventListener('click', dismiss);
|
|
}
|
|
|
|
document.addEventListener('keydown', function (e) {
|
|
if (e.key === 'Escape' && el.style.display !== 'none') {
|
|
dismiss();
|
|
}
|
|
});
|
|
|
|
// Show on load if needed
|
|
if (shouldShow()) {
|
|
// Delay slightly so it doesn't flash on fast navigations
|
|
setTimeout(show, 500);
|
|
}
|
|
})();
|