javascript之querySelector和querySelectorAll使用介紹
一開(kāi)始很多人都會(huì)拿jquery的選擇器來(lái)跟這兩個(gè)api做對(duì)比(我也是),比較異同本來(lái)沒(méi)事,但卻使一些同學(xué)對(duì)這兩個(gè)api在瀏覽器中的實(shí)現(xiàn)產(chǎn)生了誤解,特別是再dom element上調(diào)用此api時(shí)。
下面是我的jsFiddle示例,我就以此展開(kāi)說(shuō)明:
js代碼:
(function(global) {
global.doc = document;
global.body = doc.getElementsByTagName('body')[0];
global.$ = function(id) {
return doc.getElementById(id);
}
global.Logger = function(id) {
this.logElem = $(id);
this.logArr = [];
};
global.Logger.prototype = {
constructor: global.logger,
append: function(comment) {
this.logArr.push('<p>' + comment + '</p>');
},
flush: function() {
this.logElem.innerHTML = this.logArr.join('');
},
clear: function() {
this.logElem.innerHTML = '';
this.logArr = [];
}
};
})(this);
(function() {
var logger = new Logger('log');
var items = $('inner').querySelectorAll('#main h4.inside');
logger.append(items.length);
for(var i = 0, len = items.length; i < len; i++) {
logger.append(items[i].innerHTML);
}
logger.flush();
})();
(function(global) {
global.doc = document;
global.body = doc.getElementsByTagName('body')[0];
global.$ = function(id) {
return doc.getElementById(id);
}
global.Logger = function(id) {
this.logElem = $(id);
this.logArr = [];
};
global.Logger.prototype = {
constructor: global.logger,
append: function(comment) {
this.logArr.push('<p>' + comment + '</p>');
},
flush: function() {
this.logElem.innerHTML = this.logArr.join('');
},
clear: function() {
this.logElem.innerHTML = '';
this.logArr = [];
}
};
})(this);
(function() {
var logger = new Logger('log');
var items = $('inner').querySelectorAll('#main h4.inside');
logger.append(items.length);
for(var i = 0, len = items.length; i < len; i++) {
logger.append(items[i].innerHTML);
}
logger.flush();
})();
html代碼:
<div id="main"> <div id="inner"> <h4 class="inside">h4 inside 1</h4> <h4 class="inside">h4 inside 2</h4> <ul class="nodelist"> <li>list item one</li> <li>list item two</li> <li>list itme three</li> </ul> </div> <div id="outter"> <h4 class="outside">h4 outside 1</h4> <h4 class="outside">h4 outside 2</h4> </div> <div id="log"></div>
css代碼:
#log {
font-size: 10px;
}
誤解就在于對(duì)$('inner').querySelectorAll('#main h4.inside')的實(shí)現(xiàn)理解,不少人一開(kāi)始幾乎都認(rèn)為是直接從div[id='inner']的孩子中進(jìn)行查找(我也是),這個(gè)#main有點(diǎn)礙眼。實(shí)際上它還是根據(jù)selector string從整個(gè)document上查找,再返回屬于div[id='inner']的子節(jié)點(diǎn)。很多人會(huì)疑惑,那么為什么不按照直接按父節(jié)點(diǎn)找子節(jié)點(diǎn)的方式來(lái)實(shí)現(xiàn)呢?就像elem.getElementsByTagName,我的想法是靈活selector string吧。
querySelector只返回匹配的第一個(gè)元素,如果沒(méi)有匹配項(xiàng),返回null。
querySelectorAll返回匹配的元素集合,如果沒(méi)有匹配項(xiàng),返回空的nodelist(節(jié)點(diǎn)數(shù)組)。
并且返回的結(jié)果是靜態(tài)的,之后對(duì)document結(jié)構(gòu)的改變不會(huì)影響到之前取到的結(jié)果。
目前IE8+,ff,chrome都支持此api(IE8中的selector string只支持css2.1的)。
相關(guān)文章
javascript限制文本框只允許輸入數(shù)字(曾經(jīng)與現(xiàn)在的方法對(duì)比)
很多時(shí)候需要用到限制文本框的數(shù)字輸入,試過(guò)許多方法,都不太理想,遂決定自己實(shí)現(xiàn)一個(gè)來(lái)玩玩,接下來(lái)介紹曾經(jīng)使用過(guò)的方法與自定義方法的對(duì)比,感興趣的朋友可以了解下啊2013-01-01
CocosCreator怎樣使用cc.follow進(jìn)行鏡頭跟隨
這篇文章主要介紹了CocosCreator怎樣使用cc.follow進(jìn)行鏡頭跟隨,想要學(xué)習(xí)follow的同學(xué),一定要看一下2021-04-04
JavaScript前端控制網(wǎng)絡(luò)并發(fā)數(shù)目的常見(jiàn)方法小結(jié)
控制前端發(fā)起請(qǐng)求的并發(fā)數(shù),即限制同一時(shí)間內(nèi)進(jìn)行處理的請(qǐng)求數(shù)量,是一種有效的策略,本文將詳細(xì)介紹前端控制并發(fā)數(shù)的幾種常見(jiàn)做法,希望對(duì)大家有所幫助2023-12-12
js中用事實(shí)證明cssText性能高的問(wèn)題
首先要感謝 EtherDream 的不同觀點(diǎn),在 巧用cssText屬性批量操作樣式 一篇中由于他的質(zhì)疑態(tài)度使我做了進(jìn)一步的測(cè)試。2011-03-03
JavaScript實(shí)現(xiàn)頁(yè)面中錄音功能的方法
這篇文章主要給大家介紹了關(guān)于JavaScript實(shí)現(xiàn)頁(yè)面中錄音功能的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用JavaScript具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06
pnpm install:ERR_PNPM_PEER_DEP_ISSUES Unmet p
這篇文章主要為大家介紹了pnpm install:ERR_PNPM_PEER_DEP_ISSUES Unmet peer dependencies報(bào)錯(cuò)解決2023-06-06
JS啟動(dòng)應(yīng)用程序的一個(gè)簡(jiǎn)單例子
用jscript實(shí)現(xiàn)啟動(dòng)程序一個(gè)例子2008-05-05
JavaScript中String對(duì)象的使用方法以及實(shí)例
這篇文章主要給大家介紹了關(guān)于JavaScript中String對(duì)象的使用方法以及實(shí)例的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),方便開(kāi)發(fā)者在JavaScript開(kāi)發(fā)中更好地處理字符串,需要的朋友可以參考下2022-04-04

