You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

判断div是否包含p标签的JS代码失效问题排查求助

问题分析与修复方案

嘿,我来帮你揪出代码失效的原因,其实问题出在对Element.contains()方法的用法理解上!

为什么你的代码没生效?

contains()这个方法的要求很明确:它必须接收一个DOM节点对象作为参数,比如你通过document.querySelector('p')拿到的那种真实元素节点。但你传入的是字符串'P',这完全不是它要的东西,所以方法直接返回false,自然就走到else分支打印“has no ps”了。

给你几种正确的实现方式

根据你的需求,这里有几个简单好用的写法:

写法1:先拿到p节点再用contains判断

let test = document.querySelector('div');
let targetP = test.querySelector('p'); // 先获取div里的第一个p元素
if (targetP && test.contains(targetP)) {
  console.log('has a p');
} else {
  console.log('has no ps');
}

这里先通过querySelector锁定div内的p元素,只要它存在,再用contains验证它确实是div的后代节点(其实querySelector已经保证了这一点,不过这么写更严谨)。

写法2:直接检查div内是否存在p元素(最简洁)

如果你的需求只是确认div里有没有p元素,完全可以不用contains,直接用querySelector的返回值判断:

let test = document.querySelector('div');
if (test.querySelector('p')) { // 找到p元素就返回真,找不到返回null(视为false)
  console.log('has a p');
} else {
  console.log('has no ps');
}

这种写法最省事,因为querySelector找不到匹配元素时会返回null,在条件判断里会被当作false处理。

写法3:遍历子节点检查(适合需要逐个验证的场景)

如果你需要遍历div的所有子节点来确认是否有p元素,可以这么写:

let test = document.querySelector('div');
// 把children伪数组转成数组,用some方法检查是否有标签为P的节点
let hasP = Array.from(test.children).some(node => node.tagName === 'P');
if (hasP) {
  console.log('has a p');
} else {
  console.log('has no ps');
}

注意哦,DOM元素的tagName属性返回的是大写字符串,所以要和'P'对比,不能写'p'

额外提醒

contains()方法会检查所有后代节点,不管是直接子节点还是嵌套在更深层的节点,这点和querySelector的行为是一致的,所以不用担心漏判深层嵌套的p元素。

内容的提问来源于stack exchange,提问作者user8758206

火山引擎 最新活动