各瀏覽器中querySelector和querySelectorAll的實(shí)現(xiàn)差異分析
querySelector和querySelectorAll是W3C提供的新的查詢(xún)接口
querySelector和querySelectorAll是W3C提供的 新的查詢(xún)接口,其主要特點(diǎn)如下:
1、querySelector只返回匹配的第一個(gè)元素,如果沒(méi)有匹配項(xiàng),返回null。
2、querySelectorAll返回匹配的元素集合,如果沒(méi)有匹配項(xiàng),返回空的nodelist(節(jié)點(diǎn)數(shù)組)。
3、返回的結(jié)果是靜態(tài)的,之后對(duì)document結(jié)構(gòu)的改變不會(huì)影響到之前取到的結(jié)果。
這兩個(gè)方法都可以接受三種類(lèi)型的參數(shù):id(#),class(.),標(biāo)簽,很像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都實(shí)現(xiàn)了NodeSelector接口。即這三種類(lèi)型的元素都擁有者兩個(gè)方法。querySelector和querySelectorAll的參數(shù)須是符合 css selector 的字符串。不同的是querySelector返回的是一個(gè)對(duì)象,querySelectorAll返回的一個(gè)集合(NodeList)。
目前 IE8/9及Firefox/Chrome/Safari/Opera 的最新版已經(jīng)支持它們。
如想獲取頁(yè)面class屬性為"red"的元素,除了使用document.getElementsByClassName('red')還可以使用document.querySelector('.red')和document.querySelectorAll('.red')。
但Element.querySelector和Element.querySelectorAll的實(shí)現(xiàn)有錯(cuò)誤,如下
<div id="d1"> <p><a >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>
如果支持這兩個(gè)方法的瀏覽器可以看到分別彈出了“http://www.sina.com.cn/”,和 “1”。說(shuō)明查詢(xún)到了想要的元素或元素集合。這與W3C的定義卻是不合的,根據(jù)定義應(yīng)該是在元素d1范圍內(nèi)查找"div a",而d1內(nèi)壓根沒(méi)有div。因此應(yīng)該分別返回null,空集合。
jQuery1.4.2 及之前版本中只使用了document.querySelectorAll,沒(méi)有使用Element.querySelectorAll。 jQuery1.4.3 后使用了Element.querySelectorAll,但做了修復(fù)。在選擇器前加了"#__sizzle__"以強(qiáng)制其在指定元素內(nèi)查找(3903-3918行)。簡(jiǎn)化下
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" ); }
實(shí)現(xiàn)很巧妙,指定范圍的元素如果有id,將其保留在old,"__sizzle__"賦值其作為臨時(shí)id,在選擇器"div a"前指定查找范圍為"#__sizzle__",即d1。finally語(yǔ)句來(lái)最后清理,如果指定范圍的元素本身有id將其恢復(fù)為old,沒(méi)有則去掉臨時(shí)的id屬性"__sizzle__"。
相關(guān):
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
相關(guān)文章
jQuery+ThinkPHP實(shí)現(xiàn)圖片上傳
這篇文章主要為大家詳細(xì)介紹了jQuery+ThinkPHP實(shí)現(xiàn)圖片上傳,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-07-07jquery+css實(shí)現(xiàn)的紅色線條橫向二級(jí)菜單效果
這篇文章主要介紹了jquery+css實(shí)現(xiàn)的紅色線條橫向二級(jí)菜單效果,界面美觀大方,簡(jiǎn)潔實(shí)用,通過(guò)jquery遍歷及切換頁(yè)面元素實(shí)現(xiàn)這一功能,需要的朋友可以參考下2015-08-08jquery和雅虎的yql服務(wù)實(shí)現(xiàn)天氣預(yù)報(bào)服務(wù)示例
本文介紹一個(gè)利用Jquery和雅虎的YQL服務(wù)實(shí)現(xiàn)天氣預(yù)報(bào)功能,需要的朋友可以參考下2014-02-02jQuery動(dòng)態(tài)改變圖片顯示大小(修改版)的實(shí)現(xiàn)思路及代碼
這篇文章主要介紹了jQuery動(dòng)態(tài)改變圖片顯示大小(修改版)的實(shí)現(xiàn)思路及代碼,有需要的朋友可以參考一下2013-12-12jquery文檔操作wrap()方法實(shí)例簡(jiǎn)述
這篇文章主要介紹了jquery文檔操作wrap()方法,以實(shí)例形式簡(jiǎn)單分析了wrap()方法用某個(gè)標(biāo)簽將某個(gè)元素包起來(lái)的使用技巧,需要的朋友可以參考下2015-01-01