如何使用原生JavaScript selector获取无HTML标签包裹的击杀数字段
无标签包裹击杀数文本的获取方案
CSS 选择器本身不支持直接选取没有HTML标签包裹的纯文本节点,因此需要先定位到文本所属的父容器,再通过DOM节点属性过滤提取目标内容,具体实现如下:
实现逻辑说明
- 先通过常规选择器定位到每行数据的第二个
<td>元素(即包含玩家名和击杀数的单元格) - 遍历该
<td>的所有子节点,筛选出nodeType = 3的文本节点(DOM规范中文本节点的nodeType固定为3) - 去掉文本节点的前后空白和包裹的引号,转换为数字即可使用
完整可运行代码示例
// 存储所有玩家的击杀记录 const allKillData = [] // 遍历表格的每一行数据 document.querySelectorAll('table tr').forEach(tr => { // 获取当前行的怪物名称 const monster = tr.querySelector('td:first-child b')?.textContent.trim() // 获取当前行的玩家名称 const player = tr.querySelector('td:nth-child(2) b a')?.textContent.trim() // 跳过空行或格式不匹配的行 if (!monster || !player) return // 定位到包含击杀数的单元格 const killCountCell = tr.querySelector('td:nth-child(2)') let killCountStr = '' // 遍历单元格的所有子节点,筛选文本节点 killCountCell.childNodes.forEach(node => { // 仅保留有实际内容的文本节点 if (node.nodeType === 3 && node.textContent.trim().length > 0) { killCountStr = node.textContent.trim() } }) // 去除文本中的引号,转换为数字,转换失败时默认赋值0 const killCount = Number(killCountStr.replaceAll('"', '')) || 0 // 存入结果数组 allKillData.push({ monster, player, killCount }) }) // 业务逻辑示例:判断玩家X是否击杀500只龙 const targetData = allKillData.find(item => item.player === '玩家X' && item.monster === '龙') if (targetData && targetData.killCount >= 500) { // 此处写入你需要的触发逻辑,比如弹窗、展示提示等 console.log(`玩家X击杀龙的数量已达到${targetData.killCount},满足触发条件`) }
简化方案(适合固定结构场景)
因为你给出的HTML结构是固定的,第二个<td>的子节点顺序固定为[<b>元素, 击杀数文本节点, <br>元素],也可以直接通过下标取文本节点,代码更精简:
// 直接通过下标获取击杀数文本 const killCountCell = tr.querySelector('td:nth-child(2)') const killCountStr = killCountCell.childNodes[1].textContent.trim() const killCount = Number(killCountStr.replaceAll('"', '')) || 0
内容的提问来源于stack exchange,提问作者Emdelin
相关产品推荐
相关产品推荐

