querySelector选取元素不准的情况

首先先稍微讲一下情况,大概就是写爬虫时使用querySelector选取元素时发现选取结果与预期不符

比如如下的情况

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"> 
<title>test</title> 
</head>
<body>
<div>
	<div>
	</div>
	<div id='content'>
		<p>1</p>
		<div>
			<div></div>
			<div>
				<p>2</p>
			</div>
		</div>
	</div>
</div>

在上面的html里使用

document.querySelector('#content').querySelector('div >div:nth-child(2) p')

 然后直观的思考结果应该是下面的html界面中哪个元素?

第一感觉应该选取到的是<p>2</p>吧

然而选取结果是<p>1</p>

至于为什么会有这样的结果,困扰了我很久,知道看到一篇其他人的博客才稍微解开疑惑【博客地址于文章最后】

博客中概述了querySelector是先全局选取了所有符合querySelector('div >div:nth-child(2) p')的元素,然后再判断是否在document.querySelector('#content')中,如果在的话,则进行返回。

个人理解,即逻辑类似下面代码这样

var temp = document.querySelectorAll('div >div:nth-child(2) p');
temp = [].slice.call(temp);
var temp2 = document.querySelectorAll('#content *');
temp2 = [].slice.call(temp2);
for(ele of temp){
    if(temp2.indexOf(ele) != -1){
        console.log(ele);
        break;
    }
}
    

这个解释了一下为什么会这样。【参考自其它人博客,不知道哪里能找到querySelector源码之类的看,所以也不能百分百肯定这部分逻辑是否正确】

从这个逻辑推算,我最后得出的解决方案

1.把选择器放在一起,不要分开查询(比较推荐)

例子中的document.querySelector('#content').querySelector('div >div:nth-child(2) p')

可以改为document.querySelector('#content div >div:nth-child(2) p')

当然大部分情况下都不是这样直接多重查询,选择的都是var temp = document.querySelector('#content')这种变量存储,然后多次使用,这里只是举例,可以把这些变量之前的值也一起选择

2.尽量缩小查询范围,避免误差

例子中的document.querySelector('#content').querySelector('div >div:nth-child(2) p')

可以改为document.querySelector('#content').querySelector('div >div:nth-child(2)').querySelector('p')

这种方法依然会可能有误差,但是可能比较小,因为查询范围已经被压缩了。这种情况用于,之前是通过函数传递值之类的,不方便修改选择器那些。但是依然有误差,所以注意测试

 

参考博客:https://www.cnblogs.com/fengma/p/7410473.html

### 如何使用 `querySelector` 获取子元素的 `clientWidth` 可以通过 JavaScript 的 `document.querySelector` 方法来选择目标子元素,并访问其 `clientWidth` 属性。以下是实现这一功能的具体方式: ```javascript // 使用 querySelector 选择子元素 const childElement = document.querySelector('selector'); // 替换 'selector' 为目标子元素的选择器 // 访问 clientWidth 属性 if (childElement) { const width = childElement.clientWidth; console.log(`子元素的宽度为: ${width}px`); } else { console.error('未找到匹配的子元素'); } ``` 上述代码片段展示了如何利用 `querySelector` 来定位页面上的特定子元素并读取它的 `clientWidth` 值[^1]。 需要注意的是,`clientWidth` 返回的是元素的内容区域宽度(以像素为单位),它包含了内边距(padding),但不包含垂直滚动条、外边距(margin)、以及边框(border)。这与 `offsetWidth` 和其他尺寸测量属性有所不同[^4]。 另外,在某些布局情况下,如果父级容器设置了特殊的 CSS 变形或样式(例如 `transform` 或者自定义变量控制的位置调整),可能会影响最终渲染出来的视觉效果,但这并不会改变通过 `clientWidth` 测量的实际数值[^3]。 对于嵌套结构中的子元素而言,当涉及到滚动行为时需特别注意,因为可滚动的高度/宽度仅限于内容区加上内边距部分而不含外部边框[^5]。 #### 注意事项 - 如果所选 DOM 节点尚未加载完成或者根本不存在,则调用 `.clientWidth` 将会失败,因此建议确保操作发生在文档完全就绪之后。 - 对于动态生成的内容,请确认脚本执行时机适当以免捕获不到最新状态下的数据。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值