初始化

This commit is contained in:
2026-08-08 18:28:49 +08:00
parent 9bef4420e0
commit f082037a6e
854 changed files with 217171 additions and 11 deletions
+107
View File
@@ -0,0 +1,107 @@
/**
* csp_global.js — MES2 全局事件委托脚本
*
* 设计目标:在「无 'unsafe-inline' / 无 'unsafe-eval'」的严格 CSP 下,
* 彻底替代原有的内联事件处理器(onclick / onchange / onsubmit / oninput)。
*
* 两种迁移方式(均不使用 eval,符合严格 CSP):
* 1) 语义类(来自早期批次改造)
* - a.confirm-link[data-confirm] : 点击前 confirm 确认
* - form.confirm-form[data-confirm] : 提交前 confirm 确认
* - .station-card[data-href] : 卡片点击跳转(仅当带 data-href)
* - select.auto-submit : 变更即提交所在表单
* 2) 函数委托(用于动态生成的复杂处理器)
* - [data-action="fnName" data-args='[...]'] : 调用 window.fnName(...args)
* - [data-action-el="fnName" data-args='[...]'] : 调用 window.fnName(el, ...args)
* data-action-el 会把触发元素 el 作为第一个参数传入,
* 便于处理器读取 el.value / el.checked 等动态值)
*
* 注意:所有被调用的函数(addField、updateFieldsConfig、openEditModal …)
* 必须由对应视图 / 辅助文件的「带 nonce 的 <script>」定义为全局函数。
*/
(function () {
'use strict';
// ---------- 1) 语义类处理器 ----------
// 确认型链接
document.addEventListener('click', function (e) {
var a = e.target.closest('a.confirm-link');
if (a) {
var msg = a.getAttribute('data-confirm') || '确定执行该操作?';
if (!window.confirm(msg)) {
e.preventDefault();
}
}
});
// 确认型表单
document.addEventListener('submit', function (e) {
var form = e.target;
if (form && form.classList && form.classList.contains('confirm-form')) {
var msg = form.getAttribute('data-confirm') || '确定执行该操作?';
if (!window.confirm(msg)) {
e.preventDefault();
}
}
});
// 工位卡片导航(仅当卡片带有 data-href 时才拦截跳转,避免影响未改造的普通 <a> 卡片)
document.addEventListener('click', function (e) {
var card = e.target.closest('.station-card[data-href]');
if (card) {
e.preventDefault();
var href = card.getAttribute('data-href');
if (href) {
window.location.href = href;
}
}
});
// 自动提交
document.addEventListener('change', function (e) {
var el = e.target;
if (el && el.classList && el.classList.contains('auto-submit') && el.form) {
el.form.submit();
}
});
// ---------- 2) 函数委托处理器 ----------
function fire(el, attr, withEl) {
var name = el.getAttribute(attr);
if (!name) return;
var fn = window[name];
if (typeof fn !== 'function') {
if (window.console) console.warn('[csp_global] 未找到全局函数: ' + name);
return;
}
var args = [];
var aj = el.getAttribute('data-args');
if (aj) {
try { args = JSON.parse(aj); } catch (_) { args = []; }
}
if (withEl) {
fn.apply(null, [el].concat(args));
} else {
fn.apply(null, args);
}
}
function delegate(evt) {
document.addEventListener(evt, function (e) {
var el = e.target.closest('[data-action],[data-action-el]');
if (!el) return;
if (el.hasAttribute('data-action-el')) {
fire(el, 'data-action-el', true);
} else {
fire(el, 'data-action', false);
}
});
}
delegate('click');
delegate('change');
delegate('submit');
delegate('input');
})();