72 lines
2.6 KiB
JavaScript
72 lines
2.6 KiB
JavaScript
/* ============================================================================
|
||
* 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);
|