各浏览器中querySelector和querySelectorAll的实现差异分析_jquery

querySelector和querySelectorAll是W3C提供的新的查询接口

querySelector和querySelectorAll是W3C提供的 新的查询接口,其主要特点如下:

1、querySelector只返回匹配的第一个元素,如果没有匹配项,返回null。
2、querySelectorAll返回匹配的元素集合,如果没有匹配项,返回空的nodelist(节点数组)。
3、返回的结果是静态的,之后对document结构的改变不会影响到之前取到的结果。

这两个方法都可以接受三种类型的参数:id(#),class(.),标签,很像jquery的选择器。

var obj = document.querySelector("#id");var obj = document.querySelector(".classname");
var obj = document.querySelector("div");
var el = document.body.querySelector("style[type='text/css'], style:not([type])");
var elements = document.querySelectorAll("#score>tbody>tr>td:nth-of-type(2)");
var elements = document.querySelectorAll("#id1, #id2, .class1, class2, div a, #list li img");

目前IE8+,ff,chrome都支持此api(IE8中的selector string只支持css2.1的)
浏览器支持查看

module dom {
[Supplemental, NoInterfaceObject]
interface NodeSelector {
Element querySelector(in DOMString selectors);
NodeList querySelectorAll(in DOMString selectors);
};
Document implements NodeSelector;
DocumentFragment implements NodeSelector;
Element implements NodeSelector;
};

Feature Chrome Firefox (Gecko) Internet Explorer Opera Safari (WebKit)
Basic support 1 3.5 (1.9.1)
bug 416317
9
8 (CSS2 selectors only)
10 3.2 (525.3)
WebKit bug 16587
Feature Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
Basic support 2.1 yes 9 10.0 3.2

从接口定义可以看到Document、DocumentFragment、Element都实现了NodeSelector接口。即这三种类型的元素都拥有者两个方法。querySelector和querySelectorAll的参数须是符合 css selector 的字符串。不同的是querySelector返回的是一个对象,querySelectorAll返回的一个集合(NodeList)。

目前 IE8/9及Firefox/Chrome/Safari/Opera 的最新版已经支持它们。

如想获取页面class属性为"red"的元素,除了使用document.getElementsByClassName('red')还可以使用document.querySelector('.red')和document.querySelectorAll('.red')。

但Element.querySelector和Element.querySelectorAll的实现有错误,如下

<div id="d1">
<p><a href="http://www.sina.com.cn">SINA</a></p>
</div>
<script type="text/javascript">
function $(id){return document.getElementById(id);}
var d1 = $('d1');
var obj1 = d1.querySelector('div a');
var obj2 = d1.querySelectorAll('div a');
alert(obj1); // -> http://www.sina.com.cn/
alert(obj2.length); // -> 1
</script> 

如果支持这两个方法的浏览器可以看到分别弹出了“http://www.sina.com.cn/”,和 “1”。说明查询到了想要的元素或元素集合。这与W3C的定义却是不合的,根据定义应该是在元素d1范围内查找"div a",而d1内压根没有div。因此应该分别返回null,空集合。

jQuery1.4.2 及之前版本中只使用了document.querySelectorAll,没有使用Element.querySelectorAll。 jQuery1.4.3 后使用了Element.querySelectorAll,但做了修复。在选择器前加了"#__sizzle__"以强制其在指定元素内查找(3903-3918行)。简化下

function $(id){return document.getElementById(id);}
var d1 = $('d1');
var obj1 = d1.querySelector('div a');
var obj2 = d1.querySelectorAll('div a');
var old = d1.id, id = d1.id = "__sizzle__";
try {
var query = '#' + id + ' div a';
alert(d1.querySelector( query ));
alert(d1.querySelectorAll( query ).length);
} catch(e) {
} finally {
old ? d1.id = old : d1.removeAttribute( "id" );
} 

实现很巧妙,指定范围的元素如果有id,将其保留在old,"__sizzle__"赋值其作为临时id,在选择器"div a"前指定查找范围为"#__sizzle__",即d1。finally语句来最后清理,如果指定范围的元素本身有id将其恢复为old,没有则去掉临时的id属性"__sizzle__"。

相关:
http://msdn.microsoft.com/en-us/library/cc288169%28v=VS.85%29.aspx
http://msdn.microsoft.com/en-us/library/cc304115%28VS.85%29.aspx
https://developer.mozilla.org/En/DOM/Document.querySelector
https://developer.mozilla.org/En/DOM/Document.querySelectorAll
https://developer.mozilla.org/En/DOM/element.querySelector
https://developer.mozilla.org/En/DOM/Element.querySelectorAll

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索querySelectorAll
querySelector
jquery queryselector、queryselector、queryselectorall、js queryselector、js queryselectorall,以便于您获取更多的相关知识。

时间: 2024-08-03 14:20:06

各浏览器中querySelector和querySelectorAll的实现差异分析_jquery的相关文章

javascript之querySelector和querySelectorAll使用说明_javascript技巧

一开始很多人都会拿jquery的选择器来跟这两个api做对比(我也是),比较异同本来没事,但却使一些同学对这两个api在浏览器中的实现产生了误解,特别是再dom element上调用此api时. 下面是我的jsFiddle示例,我就以此展开说明: 复制代码 代码如下: (function(global) { global.doc = document; global.body = doc.getElementsByTagName('body')[0]; global.$ = function(i

javascript之querySelector和querySelectorAll使用介绍_javascript技巧

一开始很多人都会拿jquery的选择器来跟这两个api做对比(我也是),比较异同本来没事,但却使一些同学对这两个api在浏览器中的实现产生了误解,特别是再dom element上调用此api时. 下面是我的jsFiddle示例,我就以此展开说明: js代码: (function(global) { global.doc = document; global.body = doc.getElementsByTagName('body')[0]; global.$ = function(id) {

javascript高级选择器querySelector和querySelectorAll全面解析_基础知识

querySelector 和 querySelectorAll 方法是 W3C Selectors API 规范中定义的.他们的作用是根据 CSS 选择器规范,便捷定位文档中指定元素. 目前几乎主流浏览器均支持了他们.包括 IE8(含) 以上版本. Firefox. Chrome.Safari.Opera. querySelector 和 querySelectorAll 在规范中定义了如下接口: module dom { [Supplemental, NoInterfaceObject] i

浏览器中唤起Native App

前段时间遇到一个小需求:要求在分享出来的h5页面中,有一个立即打开的按钮,如果本地安装了我们的app,那么点击就直接唤起本地app,如果没有安装,则跳转到下载. 因为从来没有做过这个需求,因此这注定是一个苦逼的调研过程. 我们最开始就面临2个问题:一是如何唤起本地app,二是如何判断浏览器是否安装了对应app. 如何唤起本地app 首先,想要实现这个需求,肯定是必须要客户端同学的配合才行,因此我们不用知道所有的实现细节,我们从前端角度思考看这个问题,需要知道的一点是,ios与Android都支持

前端常见兼容问题系列4:sort方法在浏览器中执行效果的差异

前面写了好几个安卓系统下一些手机中的兼容性问题.这次我们来一个iOS系统下的. 有这么一个HTML片段: <body> <p id="container"></p> <div> <script> var str = '' var arr = [ {name: "3", value: "50"}, {name: "2", value: "60"},

电脑中怎么将360浏览器中收藏的网页导入到Edge浏览器中

  电脑中怎么将360浏览器中收藏的网页导入到Edge浏览器中          1.打开360浏览器,点击左上角的"收藏"; 2.打开下拉菜单后点击"导入/导出"; 3.在"导出收藏夹"中点击"导出到IE浏览器"; 4.稍等片刻后会提示导出成功,点击确定,这样,360浏览器中收藏的网页就导入到IE浏览器中了; 5.打开Edge浏览器,点击打开右上角的菜单; 6.点击"导入收藏夹"按钮; 7.勾选"

word文档-如何在360浏览器中直接 打开word文件 ?

问题描述 如何在360浏览器中直接 打开word文件 ? 在IE浏览器中可以.碰到WORD文档,自动就下载了!为什么? 解决方案 需要有浏览器插件,IE一般有OFFICE插件,所以可以直接打开 解决方案二: 因为360是非法流氓软件,它根本就是粗陋地用IE的内核拼凑了一个山寨的浏览器,做一个稍微有点用的软件功能只是它实施违法犯罪侵害用户计算机和数据的幌子而已. 解决方案三: 这个好像需要转换吧.吧word转成pdf格式的然后在线显示!

win7旗舰版电脑浏览器中的字体变小了怎么办

  每当咱们需要搜索网页,搜索信息的时候,都需要开启咱们win7旗舰版64位系统下载中的浏览器,一般来说,咱们win7旗舰版系统中网页的字体.字号.颜色这些都是系统默认设置的,也是比较适中的字体,但是最近却有不少用户遇到了网页字体过小的情况.据该用户咨询说,他采用传统的Ctrl+鼠标滚轮的方式无法令网页字体变大,但是切换到Chrome浏览器中,网页的字体却是正常,唯独在IE浏览器里字体变小,那么遇到这样的情况,咱们要如何处理呢?下面,小编就详细的来介绍一下吧! 1.首先,咱们打开win7旗舰版电

win7电脑如何批量复制IE浏览器中的网址?

         win7电脑如何批量复制IE浏览器中的网址?   1.首先,咱们双击打开IE浏览器程序,然后在上方的任务栏窗口中点击工具选项,之后会出现一个下滑菜单,咱们点击其中的Internet选项. 2.之后便会打开如下图中所示的Internet选项窗口了,咱们将界面切换到常规这一栏,然后点击下方的使用当前页. 3.这个时候,IE浏览器便会自动的开始获取目前咱们打开的所有网页的网址信息,然后出现在窗口中,咱们只需要全部选中,然后单击右键,选择复制就可以了.