diff --git a/src/Admin/Native/PayChargeCards.php b/src/Admin/Native/PayChargeCards.php index 6cd0a6d2..fe392193 100644 --- a/src/Admin/Native/PayChargeCards.php +++ b/src/Admin/Native/PayChargeCards.php @@ -399,7 +399,16 @@ class PayChargeCards { __('自定义自动生成的长度(不能太短,太短可能会出现重复)如果启用了单密码模式,可以将卡号位数设置为0', 'aksrt') ); - // 导入卡密(与参考主题一致的提示文案与示例)。 + // 导入提示统一放在「卡密数据」正上方:切换卡密类型/添加方式时, + // 命中的那一条紧邻示例数据与输入框,便于对照填写。 + $this->field_row( + __('单密码模式', 'aksrt'), + '', + [ + ['key' => 'add_type', 'op' => '==', 'val' => 'import'], + ['key' => 'type', 'op' => '==', 'val' => 'custom'], + ] + ); $this->submessage_row( [ ['key' => 'add_type', 'op' => '!=', 'val' => 'auto'], @@ -429,14 +438,6 @@ class PayChargeCards {
6484027668705 SkdJZ5vWcpqPxrbs3pqPcpq level=2&time=Permanent ' . esc_html__('永久2级会员', 'aksrt') . '
' ); - $this->field_row( - __('单密码模式', 'aksrt'), - '', - [ - ['key' => 'add_type', 'op' => '==', 'val' => 'import'], - ['key' => 'type', 'op' => '==', 'val' => 'custom'], - ] - ); $this->submessage_row( [ ['key' => 'add_type', 'op' => '==', 'val' => 'import'], @@ -1080,9 +1081,10 @@ class PayChargeCards { return els[0].value; } function evalDeps() { - // 选择器同时匹配行元素与提示块自身:提示块可能脱离所在行, - // 因此每层都各自带 data-dep 并各自落 display,谁在 DOM 里就管谁。 - document.querySelectorAll('.aksrt-cardpass-form [data-dep]').forEach(function (el) { + // 全文档查找 data-dep 节点:行与提示块各自带状态、各自落 display。 + // 刻意不做限域(不写 .aksrt-cardpass-form 前缀):提示块一旦被 HTML 解析 + // 移出表格甚至移出表单子树,限域查找会让它停在初始隐藏状态,表现为「提示不见了」。 + document.querySelectorAll('[data-dep]').forEach(function (el) { try { var deps = JSON.parse(el.getAttribute('data-dep')); var show = deps.every(function (d) { @@ -1100,9 +1102,9 @@ class PayChargeCards { } catch (e) { /* noop */ } }); } - document.addEventListener('change', function (e) { - if (e.target.closest('.aksrt-cardpass-form')) evalDeps(); - }); + // 任何 change 都重新求值:不做「是否属于本表单」的限定, + // 因为提示块的祖先链在这种页面上并不保证还挂在表单内。 + document.addEventListener('change', evalDeps); // 唯一的初始求值入口:本脚本在表单之前输出,此刻解析尚未到达表单, // 直接求值必然取不到任何行(空操作);因此必须等 DOM 就绪后按默认值校正一次。 // 服务端已按默认值预隐藏,这里只做兜底校正。 diff --git a/tests/admin/charge-cards-dependency.test.cjs b/tests/admin/charge-cards-dependency.test.cjs index 23e1f304..d7249319 100644 --- a/tests/admin/charge-cards-dependency.test.cjs +++ b/tests/admin/charge-cards-dependency.test.cjs @@ -135,7 +135,7 @@ function createForm() { readyState: 'loading', querySelectorAll(sel) { if (sel === '.aksrt-cardpass-form [name]') return inputs; - if (sel === '.aksrt-cardpass-form [data-dep]') return rows.map((row) => row.el); + if (sel === '[data-dep]') return rows.map((row) => row.el); return []; }, addEventListener(type, fn) { (handlers[type] = handlers[type] || []).push(fn); }, @@ -207,7 +207,9 @@ test('两种行渲染都接入服务端预隐藏,避免首帧铺开', () => { // foster-parent 到 之前)仍能被求值并保持隐藏。 assert.match(page, /