querySelector/querySelectorAll选择器两个容易忽略的点_html/css_WEB-ITnose

WBOY
Release: 2016-06-24 11:30:25
Original
1358 people have browsed it

jquery写得多了,原生js大API就容易忘。如果你也是这样,一起来回顾一下HTML5的类jquery选择器querySelector和querySelectorAll吧,querySelectorAll这个API有两个需要注意的点,见下文。

先看看querySelector,语法:

dom.querySelector(selectors)
Copy after login

dom即任意dom元素,selectors是一个css选择器字符串, 什么是css选择器字符串? 什么类选择器、ID选择器、元素选择器都是css选择器字符串

querySelector返回dom的子元素中第一个符合selectors选择器字符串的元素,无匹配项则返回null

example:

<div id="contani">    <div>        Tencent    </div>    <div>        Alibaba    </div></div><script>    console.log( document.querySelector('#contani div') )</script>
Copy after login

结果输出的是

Tencent
这个div

querySelectorAll,语法:

dom.querySelectorAll(selectors)
Copy after login

和上面一样,不同的是它返回的是匹配的所有元素列表,是一个nodeList集合,而且是non-live的

example:(html结构还是和上面一样)

console.log( document.querySelectorAll('#contani div') )
Copy after login

结果当然是返回了两个子div

什么叫non-live?理解为不会实时更新就好了, querySelectorAll匹配的元素有变化时,它的结果也不会实时更新 ,这是要注意的第一点

example:

<div id="contani">    <div class="child">        Tencent    </div>    <div class="child">        Alibaba    </div></div><script>    var m = document.querySelectorAll('.child');    var n = document.getElementsByClassName('child');    console.log( 'querySelectorAll: ' + m.length )    console.log( 'getElementsByTagName: ' + n.length )    var newDiv = document.createElement('div');    newDiv.className = 'child';    contani.appendChild(newDiv);    console.log('---------append child---------')    console.log( 'querySelectorAll: ' + m.length )    console.log( 'getElementsByTagName: ' + n.length )</script>
Copy after login

输出:

事实证明,js动态创建了一个class为child的div插入到contani容器中,querySelectorAll的结果集并未实时更新,而getElementsByTagName的结果集是live实时更新的。

关于querySelectorAll另外要注意的一点是: 当且仅当querySelectorAll的选择器字符串是‘div div’时(如:dom.querySelectorAll(‘div div’)),它匹配的元素包括了dom,也就是说如果该dom元素和它的子元素构成了div div这种父子结构时,也会被匹配到 。

example:

<div class="contani">    <div class="contani">        Qihoo        <div>Safe</div>    </div>    <div class="child">        Tencent        <div>QQ</div>    </div>    <div class="child">        Alibaba        <div>Alipay</div>    </div></div><div class="child">    Baidu    <div>Family tong</div></div><script>    console.log( document.querySelectorAll('.contani div div').length )    console.log( document.querySelector('.contani').querySelectorAll('div div').length )    console.log( document.querySelectorAll('div div').length )</script>
Copy after login

console.log( document.querySelectorAll('.contani div div').length )console.log( document.querySelector('.contani').querySelectorAll('div div').length )

这两种匹配结果看似一样,实际上是不是一样的呢?结合上文所讲, 自己先想想结果是多少,然后再 戳这里查看结果 验证自己是否理解了本文所讲的内容吧

作者:古德God

出处: http://www.cnblogs.com/wangmeijian

本文版权归作者和博客园所有,欢迎转载,转载请标明出处。

如果您觉得本篇博文对您有所收获,请点击右下角的 [推荐],谢谢!

source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template