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, / {
|