pbl_scense_ext/wwwroot/overlay/pbl_overlay_loader.js
2026-09-21 11:53:56 +08:00

72 lines
2.6 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/* ============================================================================
* pbl_overlay_loader.js —— 覆盖层脚本/CSS 按需注入器(M9)
*
* 为什么需要它:bricks .ui 页面禁止硬写 <script>/<link> 标签(会绕过 RBAC 或
* 触发 403)。本 loader 由页面壳的 bricks `script` actiontype 在用户点击
* 「启用 PBL 覆盖层」时调用,动态注入同模块 wwwroot/overlay 下的 JS/CSS
* (这些路径已在 scripts/load_path.py 显式注册为 any/logined),注入完成后
* 调用 PblOverlayPlay.boot() 完成装配。
*
* 铁律:只注入本模块静态资源,不改写宿主(scense/scense_game)渲染层任何脚本。
* ==========================================================================*/
(function (global) {
'use strict';
var BASE = String(global.__PBL_API_BASE__ || '').replace(/\/$/, '');
var DIR = BASE + '/pbl_scense_ext/overlay/';
// 依赖顺序:core → transport → play(play 内部依赖前两者)
var FILES = ['pbl_overlay_core.js', 'pbl_overlay_transport.js', 'pbl_overlay_play.js'];
var CSS = 'pbl_overlay.css';
var injected = {};
var loading = null;
function loadOne(src) {
return new Promise(function (resolve, reject) {
if (injected[src]) { return resolve(true); }
var s = document.createElement('script');
s.src = src;
s.async = false;
s.onload = function () { injected[src] = true; resolve(true); };
s.onerror = function () { reject({ code: 'PBL_E_NETWORK', message: '资源加载失败 ' + src }); };
document.head.appendChild(s);
});
}
function ensureCss() {
var id = 'pbl-overlay-css';
if (document.getElementById(id)) { return; }
var l = document.createElement('link');
l.id = id;
l.rel = 'stylesheet';
l.href = DIR + CSS;
document.head.appendChild(l);
}
function load() {
ensureCss();
if (loading) { return loading; }
loading = FILES.reduce(function (p, f) {
return p.then(function () { return loadOne(DIR + f); });
}, Promise.resolve());
return loading;
}
// 幂等启动:已存在实例则复用(切换页面上下文时可 destroy 后重建)
function start(opts) {
return load().then(function () {
if (!global.PblOverlayPlay) { throw { code: 'PBL_E_NOT_FOUND', message: 'PblOverlayPlay 未注册' }; }
if (global.__PBL_OVERLAY__ && global.__PBL_OVERLAY__.mounted) { return global.__PBL_OVERLAY__; }
return global.PblOverlayPlay.boot(opts || {}) || global.__PBL_OVERLAY__;
});
}
global.PblOverlayLoader = {
DIR: DIR,
FILES: FILES,
load: load,
start: start
};
})(window);