fix(payment): 添加卡密页导入提示移至卡密数据上方并修正脱离表单后不显示

- 四条导入提示与「单密码模式」开关收拢到「卡密数据」行正上方:切换卡密类型/
  添加方式时,命中的那一条紧邻示例数据与输入框,便于对照填写。原先单密码模式
  开关夹在两条提示之间、提示又落在自动生成字段之后的位置不再使用。
- evalDeps() 与 change 监听不再限定在 .aksrt-cardpass-form 子树内,改为全文档
  查找 [data-dep]。提示块一旦被移出表单子树,限域查找会漏过它,其内联
  display:none 无人清除,表现为「切换到导入卡密后提示不显示」。
- 契约测试同步收紧:断言必须为全文档选择器,并显式禁止回退为限域写法。
This commit is contained in:
2026-09-17 12:03:13 +08:00
parent 670e271ff6
commit 45c7a4a59c
2 changed files with 21 additions and 17 deletions
+17 -15
View File
@@ -399,7 +399,16 @@ class PayChargeCards {
__('自定义自动生成的长度(不能太短,太短可能会出现重复)如果启用了单密码模式,可以将卡号位数设置为0', 'aksrt')
);
// 导入卡密(与参考主题一致的提示文案与示例)。
// 导入提示统一放在「卡密数据」正上方:切换卡密类型/添加方式时,
// 命中的那一条紧邻示例数据与输入框,便于对照填写。
$this->field_row(
__('单密码模式', 'aksrt'),
'<input type="checkbox" name="only_pass_s" value="1" />',
[
['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 {
<div>6484027668705 SkdJZ5vWcpqPxrbs3pqPcpq level=2&time=Permanent ' . esc_html__('永久2级会员', 'aksrt') . '</div>
'
);
$this->field_row(
__('单密码模式', 'aksrt'),
'<input type="checkbox" name="only_pass_s" value="1" />',
[
['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 就绪后按默认值校正一次。
// 服务端已按默认值预隐藏,这里只做兜底校正。