再談querySelector和querySelectorAll的區(qū)別與聯(lián)系
querySelector:
return the first matching Element node within the node's subtrees. If there is no such node, the method must return null.(返回指定元素節(jié)點(diǎn)的子樹中匹配selector的集合中的第一個(gè),如果沒有匹配,返回null)
querySelectorAll:
return a NodeList containing all of the matching Element nodes within the node's subtrees, in document order. If there are no such nodes, the method must return an empty NodeList. (返回指定元素節(jié)點(diǎn)的子樹中匹配selector的節(jié)點(diǎn)集合,采用的是深度優(yōu)先預(yù)查找;如果沒有匹配的,這個(gè)方法返回空集合)
使用方法:
var element = baseElement.querySelector(selectors);
var elementList = baseElement.querySelectorAll(selectors);
這在BaseElement 為document的時(shí)候,沒有什么問題,各瀏覽器的實(shí)現(xiàn)基本一致;但是,當(dāng)BaseElement 為一個(gè)普通的dom Node的時(shí)候(支持這兩個(gè)方法的dom Node),瀏覽器的實(shí)現(xiàn)就有點(diǎn)奇怪了,舉個(gè)例子:
<div class="test" id="testId">
<p><span>Test</span></p>
</div>
<script type="text/javascript">
var testElement= document.getElementById('testId');
var element = testElement.querySelector('.test span');
var elementList = document.querySelectorAll('.test span');
console.log(element); // <span>Test</span>
console.log(elementList); // 1
</script>
按照W3C的來理解,這個(gè)例子應(yīng)該返回:element:null;elementList:[];因?yàn)樽鳛閎aseElement的 testElement里面根本沒有符合selectors的匹配子節(jié)點(diǎn);但瀏覽器卻好像無視了baseElement,只在乎selectors,也就是說此時(shí)baseElement近乎document;這和我們的預(yù)期結(jié)果不合,也許隨著瀏覽器的不斷升級(jí),這個(gè)問題會(huì)得到統(tǒng)一口徑!
人的智慧總是無窮的,Andrew Dupont發(fā)明了一種方法暫時(shí)修正了這個(gè)怪問題,就是在selectors前面指定baseElement的id,限制匹配的范圍;這個(gè)方法被廣泛的應(yīng)用在各大流行框架中;
Jquery的實(shí)現(xiàn):
var oldContext = context,
old = context.getAttribute( "id" ),<BR> nid = old || id,
try {
if ( !relativeHierarchySelector || hasParent ) {
return makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra );
}
} catch(pseudoError) {} <BR>finally {
if ( !old ) {oldContext.removeAttribute( "id" );}
}
先不看這點(diǎn)代碼中其他的地方,只看他如何實(shí)現(xiàn)這個(gè)方法的;這點(diǎn)代碼是JQuery1.6的片段;當(dāng)baseElement沒有ID的時(shí)候,給他設(shè)置一個(gè)id = "__sizzle__”,然后再使用的時(shí)候加在selectors的前面,做到范圍限制;context.querySelectorAll( "[id='" + nid + "'] " + query ;最后,因?yàn)檫@個(gè)ID本身不是baseElement應(yīng)該有的,所以,還需要移除:oldContext.removeAttribute( "id" );
,Mootools的實(shí)現(xiàn):
var currentId = _context.getAttribute('id'), slickid = 'slickid__';
_context.setAttribute('id', slickid);
_expression = '#' + slickid + ' ' + _expression;
context = _context.parentNode;
Mootools和Jquery類似:只不過slickid = 'slickid__';其實(shí)意義是一樣的;
方法兼容性:FF3.5+/IE8+/Chrome 1+/opera 10+/Safari 3.2+;
IE 8 :不支持baseElement為object;
非常感謝大牛JK的回復(fù),提供了另外一種方法。
相關(guān)文章
瀏覽器環(huán)境下JavaScript腳本加載與執(zhí)行探析之defer與async特性
defer和async特性相信是很多JavaScript開發(fā)者"熟悉而又不熟悉"的兩個(gè)特性,從字面上來看,二者的功能很好理解,分別是"延遲腳本"和"異步腳本"的作用2016-01-01
支付寶小程序從手動(dòng)埋點(diǎn)到自動(dòng)埋點(diǎn)的實(shí)現(xiàn)過程
埋點(diǎn)的意思是在你想要的數(shù)據(jù)節(jié)點(diǎn)出進(jìn)行設(shè)置,可以方便進(jìn)行采集,下面這篇文章主要給大家介紹了關(guān)于支付寶小程序從手動(dòng)埋點(diǎn)到自動(dòng)埋點(diǎn)的相關(guān)資料,需要的朋友可以參考下2022-03-03
詳解JS截取字符串的三個(gè)方法substring,substr,slice
js中有三個(gè)截取字符的方法,分別是substring()、substr()、slice(),平時(shí)我們可能都用到過,但總是會(huì)對(duì)這些方法有點(diǎn)混淆。本文將詳細(xì)介紹一下這三者的區(qū)別,需要的可以參考一下2022-03-03
BootStrap模態(tài)框閃退問題實(shí)例代碼詳解
這篇文章主要介紹了BootStrap模態(tài)框閃退問題實(shí)例代碼詳解,需要的朋友可以參考下2018-12-12
Javascript數(shù)組方法reduce的妙用之處分享
這篇文章主要給大家介紹了關(guān)于Javascript數(shù)組方法reduce的妙用之處,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Javascript具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06
JavaScript中toLocaleString()和toString()的區(qū)別實(shí)例分析
這篇文章主要介紹了JavaScript中toLocaleString()和toString()的區(qū)別,結(jié)合實(shí)例形式對(duì)比分析了toLocaleString()和toString()針對(duì)字符串、數(shù)組與日期操作過程中的區(qū)別與使用技巧,需要的朋友可以參考下2018-08-08
Bootstrap打造一個(gè)左側(cè)折疊菜單的系統(tǒng)模板(二)
這篇文章主要介紹了Bootstrap打造一個(gè)左側(cè)折疊菜單的系統(tǒng)模板(二)的相關(guān)資料,需要的朋友可以參考下2016-05-05
基于JavaScript實(shí)現(xiàn)一個(gè)月餅音樂播放器
這篇文章主要為大家詳細(xì)介紹了如何利用JavaScript實(shí)現(xiàn)一個(gè)簡(jiǎn)單的月餅音樂播放器,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以嘗試一下2022-09-09
二級(jí)域名或跨域共享Cookies的實(shí)現(xiàn)方法
適用于Asp。 在主域名設(shè)置的Cookie,在各子域名共用;適用于博客等提供二級(jí)域名。這個(gè)問題,以網(wǎng)上有眾多帖子,可惜都沒有完整解決。2008-08-08
uni-app操作數(shù)據(jù)庫的三種方法總結(jié)
數(shù)據(jù)庫操作的,可以采用多方案,下面這篇文章主要給大家介紹了關(guān)于uni-app操作數(shù)據(jù)庫的三種方法,文中通過實(shí)例代碼和圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-05-05

