向上追溯父级 <tr>:调用 <code>.closest('tr') 获取最近的表格行;
解析 ID 并转换:从 mytr161 中提取 161,拼接为 ck161;
操作复选框:通过 document.getElementById() 获取元素并设置 checked = true。
完整可执行代码
function checkTheBox(searchText) {
// 使用 XPath 精确匹配文本内容(注意:对空格/换行敏感,建议用 textContent 更鲁棒)
const xpath = `//a[text() = "${searchText.trim()}"]`;
const result = document.evaluate(xpath, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null);
const linkEl = result.singleNodeValue;
if (!linkEl) {
console.warn(`未找到文本为 "${searchText}" 的链接`);
return;
}
const trEl = linkEl.closest('tr');
if (!trEl || !trEl.id) {
console.warn(`链接所在行无 id 属性`);
return;
}
// 提取数字部分:移除前缀 "mytr",保留后续数字
const rowNumber = trEl.id.replace(/^mytr/, '');
const checkboxId = `ck${rowNumber}`;
const checkbox = document.getElementById(checkboxId);
if (checkbox && checkbox.type === 'checkbox') {
checkbox.checked = true;
// 可选:触发原页面绑定的 onclick 事件(如高亮行)
if (typeof checkbox.onclick === 'function') checkbox.onclick();
} else {
console.warn(`未找到复选框 ID: ${checkboxId}`);
}
}
// ✅ 批量处理预定义订单号列表
const orderNumbers = [
'8039089332',
'1123581321',
'xx42xxxx'
];
orderNumbers.forEach(checkTheBox);
// ✅ 或遍历页面所有相关链接(推荐限定范围,避免误操作)
// document.querySelectorAll('table tbody a').forEach(el => checkTheBox(el.textContent.trim()));
注意事项与最佳实践
-
XPath 文本匹配限制:
text() = "xxx" 要求文本完全一致(含空格、换行)。若链接内含多余空白,改用 normalize-space(): //a[normalize-space(text()) = '8039089332']
-
性能优化:避免全局
document.querySelectorAll("a"),应限定作用域(如 document.querySelector("#myTable").querySelectorAll("a"));
-
健壮性增强:使用
el.textContent.trim() 替代 innerHTML,避免 HTML 标签干扰;
-
事件兼容性:直接赋值
checked = true 不会触发 click 事件,如需执行原页面逻辑(如 changebgcolor('161')),应显式调用对应函数或触发事件: checkbox.dispatchEvent(new Event('click', { bubbles: true }));
该方案无需修改原始 HTML,纯前端实现,适用于 Greasemonkey/Tampermonkey 脚本或浏览器控制台快速调试,是处理“内容驱动 DOM 操作”的典型范例。