querySelector

本文介绍了HTML5中QuerySelector及QuerySelectorAll方法的基本用法,并通过实例对比了这两种方法与jQuery的选择器功能。同时探讨了它们之间的差异,特别是在复杂CSS选择器的支持方面。
原文地址: http://www.lovejavascript.com/#!zone/blog/content.html?id=11
Html5中有个querySelector方法,用于根据css选择符选择,看上去与jquery 的 Sizzle功能相似,写了个demo进行了一些验证。

有这么一段html

<div class="test1" id="id1">test1</div>
<p class="test2">test2</p>
<div class="test2">test2</div>
<p test3>test3</p>
<p style="display:none;">test4</p> 

接下来我们开始使用jquery的使用习惯进行测试

 

1、通过id来获取:

var id1 = document.querySelector('#id1');
console.log(id1); //<div class="test1" id="id1">test1</div>
 

获取到了id=id1的node element,等同于jquery的 $('#id1').get(0)

 

2、通过标签名称获取:

var div = document.querySelector('div');
console.log(div);//<div class="test1" id="id1">test1</div>
 

获取到了标签为div的元素,等同于jquery的$('div').get(0)

 

3、通过className获取:

var test2 = document.querySelector('.test2');
console.log(test2);  //<p class="test2">test2</p>
 

获取到了className=test2的元素,等同于jquery的$('.test2').get(0)

 

4、通过自定义属性进行获取:

var test3 = document.querySelector('[test3]');
console.log(test3); //p
 

获取到了包含自定义属性test3的node element,等同于$('[test3]')

到这里,发现querySelector()只会获取到第一个匹配的元素,这一点上与jquery sizzle 有所不同。这一点从习惯上是不大能接受的。查看文档发现HTML5在推出querySelector()的同时还一并推出了querySelectorAll()方法。该方法与querySelector()方法所接收的参数相同,不同的是该方法会返回所有相匹配的元素。

下面来试一下querySelectorAll()

 

1、获取所有DIV标签元素:

var allDiv = document.querySelectorAll('div');
console.log(allDiv);  // [div#id1.test1, div.test2]
 

通过querySelectorAll()获取到的元素为组数类型,每一个值对应一个node element。那么该如何获取其中的某个节点?

 

2、获取DIV标签的第二个节点:

var secondDiv = document.querySelectorAll('div').item(1);
console.log(secondDiv); //<div class="test2">test2</div>
 

使用item()方法,传入对应的索引值即可获得。除过这样还可以使用方括号进行获取,等同于jquery的get()方法。原生的方法可以如此支持,那兼容性如何?

 

兼容性问题:

现以全面支持IE8+,FireFox3.5+,Safari3.1+,Chrome和Op10+

IE8都支持了,是不是jquery的Sizzle 要完全要被替代了?我们来试几个复杂的CSS选择器。

 

1、div:first-child:

var firstDiv = document.querySelector('div:first-child');
console.log(firstDiv) //div#id1.test1
 

这个没问题,再来一个

 

2、div:last-child:

var lastDiv = document.querySelector('div:last-child');
console.log(lastDiv) //null
 

返回为null,表明该选择器不能找到对应的节点,再试一个。

 

3、p:hidden:

var displayNone =document.querySelector('p:hidden');
console.log(displayNone);  // null
 

依旧返回null,表明p:hidden这种形式的也不支持。

 

由此可见,querySelector并不能完全替代jquery Sizzle的,jquery sizzle所表现的实力依旧明显。当然原生的方法性能上要优于jquery,查看了下源码,发现从1.7.2版本开始(在之前的没有去找,有在再早之前发现的可以联系下我)。现贴出的为2.1.4系列中jquery Sizzle中对querySelectorAll方法的处理。
#jquery.2.1.4.js 1119行
function( tag, context ) {
    if ( typeof context.getElementsByTagName !== "undefined" ) {
        return context.getElementsByTagName( tag );
// DocumentFragment nodes don't have gEBTN
     } else if ( support.qsa ) {
return context.querySelectorAll( tag );
     }
}
 

 

由源码中可以看出,jquery中很早就对querySelector进行使用。所以如果项目中有引用的jquery,则无需使用querySelector与querySelectAll。

jquery经典绝非偶然

### querySelectorJavaScript 使用方法 `querySelector` 是一种用于选取文档中第一个匹配指定 CSS 选择器的元素的方法。它接受一个参数,即有效的 CSS 选择器字符串,并返回匹配的第一个元素作为 `HTMLElement` 对象。如果没有找到任何匹配项,则返回 `null`。 以下是具体的使用说明: #### 基本语法 ```javascript document.querySelector('css选择器'); ``` - **参数**: 一个或多个有效的 CSS 选择器字符串。 - **返回值**: 匹配的第一个元素(`HTMLElement`),或者如果没有匹配则返回 `null`[^2]。 #### 示例代码 以下是一些常见的用法示例: ##### 1. 通过类名选择元素 ```javascript const element = document.querySelector('.className'); // 返回具有 className 类的第一个元素 ``` ##### 2. 通过 ID 名称选择元素 ```javascript const elementById = document.querySelector('#uniqueId'); // 返回具有 uniqueId ID 属性的第一个元素 ``` ##### 3. 通过标签名称选择元素 ```javascript const firstParagraph = document.querySelector('p'); // 返回页面中的第一个 <p> 元素 ``` ##### 4. 组合选择器 可以组合多种选择器来更精确地定位目标元素: ```javascript const specificElement = document.querySelector('div.className #idName'); // 查找嵌套结构下的特定元素 ``` #### 注意事项 - 如果找不到符合条件的元素,`querySelector` 将返回 `null` 而不是抛出错误。 - 它只会返回第一个匹配到的元素;如果需要获取所有匹配的元素,请改用 `querySelectorAll()` 方法。 --- ### 性能优化建议 当频繁调用 `querySelector` 或其他 DOM 查询方法时,应考虑性能影响。例如,可以通过缓存查询结果减少重复计算开销。此外,尽量缩小范围,例如限定父级容器内的子节点查询,从而提升效率。 ```javascript const container = document.getElementById('container'); const targetElement = container.querySelector('.childClass'); ``` 此写法仅在 `#container` 下寻找 `.childClass` 元素,而非整个文档范围内搜索[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值