各瀏覽器中querySelector和querySelectorAll的實現(xiàn)差異分析
querySelector和querySelectorAll是W3C提供的新的查詢接口
querySelector和querySelectorAll是W3C提供的 新的查詢接口,其主要特點如下:
1、querySelector只返回匹配的第一個元素,如果沒有匹配項,返回null。
2、querySelectorAll返回匹配的元素集合,如果沒有匹配項,返回空的nodelist(節(jié)點數(shù)組)。
3、返回的結(jié)果是靜態(tài)的,之后對document結(jié)構(gòu)的改變不會影響到之前取到的結(jié)果。
這兩個方法都可以接受三種類型的參數(shù):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都實現(xiàn)了NodeSelector接口。即這三種類型的元素都擁有者兩個方法。querySelector和querySelectorAll的參數(shù)須是符合 css selector 的字符串。不同的是querySelector返回的是一個對象,querySelectorAll返回的一個集合(NodeList)。
目前 IE8/9及Firefox/Chrome/Safari/Opera 的最新版已經(jīng)支持它們。
如想獲取頁面class屬性為"red"的元素,除了使用document.getElementsByClassName('red')還可以使用document.querySelector('.red')和document.querySelectorAll('.red')。
但Element.querySelector和Element.querySelectorAll的實現(xiàn)有錯誤,如下
<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>
如果支持這兩個方法的瀏覽器可以看到分別彈出了“http://www.sina.com.cn/”,和 “1”。說明查詢到了想要的元素或元素集合。這與W3C的定義卻是不合的,根據(jù)定義應(yīng)該是在元素d1范圍內(nèi)查找"div a",而d1內(nèi)壓根沒有div。因此應(yīng)該分別返回null,空集合。
jQuery1.4.2 及之前版本中只使用了document.querySelectorAll,沒有使用Element.querySelectorAll。 jQuery1.4.3 后使用了Element.querySelectorAll,但做了修復(fù)。在選擇器前加了"#__sizzle__"以強制其在指定元素內(nèi)查找(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" );
}
實現(xiàn)很巧妙,指定范圍的元素如果有id,將其保留在old,"__sizzle__"賦值其作為臨時id,在選擇器"div a"前指定查找范圍為"#__sizzle__",即d1。finally語句來最后清理,如果指定范圍的元素本身有id將其恢復(fù)為old,沒有則去掉臨時的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.parseJSON(json)將JSON字符串轉(zhuǎn)換成js對象
本節(jié)主要介紹了使用jQuery.parseJSON(json)將JSON字符串轉(zhuǎn)換成js對象,需要的朋友可以參考下2014-07-07
網(wǎng)站如何做到完全不需要jQuery也可以滿足簡單需求
據(jù)統(tǒng)計,目前全世界57.3%的網(wǎng)站使用它。也就是說,10個網(wǎng)站里面,有6個使用jQuery。如果只考察使用工具庫的網(wǎng)站,這個比例就會上升到驚人的91.7%2013-06-06
用jquery獲取select標簽中選中的option值及文本的示例
下面小編就為大家分享一篇用jquery獲取select標簽中選中的option值及文本的示例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-01-01
jQuery插件HighCharts實現(xiàn)的2D回歸直線散點效果示例【附demo源碼下載】
這篇文章主要介紹了jQuery插件HighCharts實現(xiàn)的2D回歸直線散點效果,結(jié)合實例形式分析了jQuery基于HighCharts插件繪制直線散點圖形的具體相關(guān)操作步驟與實現(xiàn)技巧,并附帶demo源碼供讀者下載參考,需要的朋友可以參考下2017-03-03

