深入理解querySelector(All)
var elem = document.getElementById("test"),
frag = document.createDocumentFragment();
frag.appendChild(document.createElement("div"));
elem.querySelector("p");// Element, querySelectorAll
document.querySelector("div");// Document, querySelectorAll
document.body.querySelector("div");// querySelectorAll
frag.querySelector("div");// documentFragment, querySelectorAll
方法接收唯一的一个参数,该参数可为任意合法的CSS选择器字符串。不过在IE8下,对于大部分的CSS3选择器都不支持(只支持相邻兄弟element1~element2;属性选择器[attr^=val], [attr$=val],[attr*=val])。除此之外,如果想要在IE8下使用伪元素选择器,需要用:,而不是CSS3规定的::(css3选择器的浏览器支持参考:http://caniuse.com/#search=nth-of-type)。
Selectors API返回的内容是静态的NodeList,而非实时更新的NodeList,这和get系列(早期的chrome等浏览器返回的是NodeList,现在已经改为HTMLCollection实例。NodeList和HTMLCollection最大的不同就是NodeList可包括文本、注释等非元素节点,而HTMLCollection只包括元素节点)、document.images返回动态的集合(HTMLCollection)以及childNodes(NodeList)是不一样的。
Selectors API虽然好用,不过在使用的时候还是需要注意一些问题。以下面代码为例:
<body>
<div id="test"><p>test</p></div>
</body>
var ele = document.getElementById("test");
ele.querySelector("div p").length; // A
jQuery(ele).find("div p").length; // B
ele.querySelector("body p").length; // C
jQuery(ele).find("body p").length; // D
对于代码A,返回值为1,;代码B,返回值为0。代码C,返回值仍为1;代码D,返回值为0。(结果适用于所有支持Selectors API的浏览器)
对于习惯使用jQuery的人来说,上面的结果可能有点接受不了。不过在规范中明确写明:
Even though the method is invoked on an element, selectors are still evaluated in the context of the entire document. In the following example, the method will still match the
divelement's childpelement, even though thebodyelement is not a descendant of thedivelement itself.var div = document.getElementById("bar");
var p = div.querySelector("body p");

// qSA works strangely on Element-rooted queries
// We can work around this by specifying an extra ID on the root
// and working up from there (Thanks to Andrew Dupont for the technique)
// IE 8 doesn't work on object elements
} else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
var old = context.id, id = context.id = "__sizzle__"; try {
return makeArray( context.querySelectorAll( "#" + id + " " + query ), extra ); } catch(pseudoError) {
} finally {
if ( old ) {
context.id = old; } else {
context.removeAttribute( "id" );
}
}
}
不过,如果文档中真的有的元素id为“__sizzle__”,这个方法应该就会悲剧了。
在zepto中,并没有针对elem使用querySelector(All)时的特殊处理,So:
<!DOCTYPE html>
<html>
<head>
<script src="http://zeptojs.com/zepto.min.js"></script>
<meta charset="utf-8">
<title>JS Bin</title>
</head>
<body>
<div id="a"><div><p></p></div></div>
</body>
<script>
var ele = Zepto("#a").find("body div div p");
alert(ele.length); // 1
</script>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>JS Bin</title>
</head>
<body>
<div id="a"><div><p></p></div></div>
</body>
<script>
var ele =document.getElementById("a").querySelectorAll("*");
var chd = document.getElementById("a").childNodes;
alert(ele.querySelectorAll); // undefined
alert(chd.querySelectorAll); // undefined
</script>
</html>
深入理解querySelector(All)的更多相关文章
- 深入理解javascript选择器API系列第三篇——h5新增的3种selector方法
× 目录 [1]方法 [2]非实时 [3]缺陷 前面的话 尽管DOM作为API已经非常完善了,但是为了实现更多的功能,DOM仍然进行了扩展,其中一个重要的扩展就是对选择器API的扩展.人们对jQuer ...
- HTML5中类jQuery选择器querySelector的使用
简介 HTML5向Web API新引入了document.querySelector以及document.querySelectorAll两个方法用来更方便地从DOM选取元素,功能类似于jQuery的 ...
- javascript选择器querySelector和querySelectorAll的使用和区别
querySelector 和 querySelectorAll 方法是 W3C Selectors API规范中定义的.他们的作用是根据 CSS 选择器规范,便捷定位文档中指定元素. 目前几乎主流浏 ...
- querySelector和querySelectorAll
jQuery被开发者如此的青睐和它强大的选择器有很大关系,比起笨重的document.getElementById.document.getElementByName… ,查找元素很方便,其实W3C中 ...
- 原生的强大DOM选择器querySelector
在传统的 JavaScript 开发中,查找 DOM 往往是开发人员遇到的第一个头疼的问题,原生的 JavaScript 所提供的 DOM 选择方法并不多,仅仅局限于通过 tag, name, id ...
- 深入理解JavaScript 事件
本文总结自<JavaScript高级程序设计>以及自己平时的经验,针对较新浏览器以及 DOM3 级事件标准(2016年8月),对少部分内容作了更正,增加了各种例子及解析. 如无特殊说明,本 ...
- 新增的querySelector、querySelectorAll测试
从IE9开始DOM开始支持支持CSS的选择器了,DOM提供了两个接口 querySelector 得到一个DOM querySelectorAll 得到一组DOM 一个个的解释这些选择器也没有必要,我 ...
- HTML5中querySelector()和querySelectorAll()
HTML5向Web API新引入了document.querySelector以及document.querySelectorAll两个方法用来更方便地从DOM选取元素,功能类似于jQuery的选择器 ...
- 理解JavaScript中的事件路由冒泡过程及委托代理机制
当我用纯CSS实现这个以后.我开始用JavaScript和样式类来完善功能. 然后,我有一些想法,我想使用Delegated Events (事件委托)但是我不想有任何依赖,插入任何库,包括jQuer ...
随机推荐
- 找第k大数,最坏时间复杂度O(n)
(转载请注明出处,http://www.cnblogs.com/fangpei/p/3538331.html ) 以前写过的一篇,搬过来. 上算法课的时候听到老师讲这个问题,觉得还是蛮有意思的.已知数 ...
- Aggregating tests in suites
我们可以将来自不同类的test组成一个test suite.在JUnit 3.8.x我们使用 static Test suite()方法,但是在JUnit4我们使用在类前面加上注释 @RunWith( ...
- 单元测试利器JUnit4
引言 毋庸置疑,程序员要对自己编写的代码负责,您不仅要保证它能通过编译,正常地运行,而且要满足需求和设计预期的效果.单元测试正是验证代码行为是否满足预期的有效手段之一.但不可否认,做测试是件很枯燥无趣 ...
- MySQL批量更新死锁案例分析--转载
问题描述 在做项目的过程中,由于写SQL太过随意,一不小心就抛了一个死锁异常,如下: com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackE ...
- rsync+inotify实现服务器之间文件实时同步--转
之前做了“ssh信任与scp自动传输脚本”的技术文档,此方案是作为公司里备份的方法,但在实际的运行中,由于主服务器在给备份服务器传输的时候,我们的主服务器需要备份的文件是实时.不停的产生的,造成不知道 ...
- 使用Intent实现Activity的显式跳转
[正文] 这里以按钮实现活动跳转为例,为实现这个功能,我们需要三个步骤: 1.点击按钮才发生页面跳转,因此,第一步我们先要找到要点击的按钮 如何拿到按钮对象呢?通过资源id,前面我们提到过,在R.id ...
- Android面试,IntentService的原理及使用
在Android开发中,我们或许会碰到这么一种业务需求,一项任务分成几个子任务,子任务按顺序先后执行,子任务全部执行完后,这项任务才算成功.那么,利用几个子线程顺序执行是可以达到这个目的的,但是每个线 ...
- vipw和vigr命令
Modifying the Configuration Files To add user accounts, it suffices that one line is added to /etc/p ...
- 【转】AFNetworking之于https认证
转自:http://www.cocoachina.com/ios/20161220/18393.html 写在开头: 本来这篇内容准备写在AFNetworking到底做了什么?(三)中的,但是因为我想 ...
- mysql存储过程中使用临时表和游标
1.临时表 DROP PROCEDURE IF EXISTS `P_GetMonitorPeople`; CREATE PROCEDURE P_GetMonitorPeople (IN fgid IN ...