原生JS強大DOM選擇器querySelector與querySelectorAll


在傳統的 JavaScript 開發中,查找 DOM 往往是開發人員遇到的第一個頭疼的問題,原生的 JavaScript 所提供的 DOM 選擇方法並不多,僅僅局限於通過 tag, name, id 等方式來查找,這顯然是遠遠不夠的,如果想要進行更為精確的選擇不得不使用看起來非常繁瑣的正則表達式,或者使用某個庫。事實上,現在所有的瀏覽器廠商都提供了 querySelectorquerySelectorAll 這兩個方法的支持,甚至就連微軟也派出了 IE 8 作為支持這一特性的代表,querySelectorquerySelectorAll 作為查找 DOM 的又一途徑,極大地方便了開發者,使用它們,你可以像使用 CSS 選擇器一樣快速地查找到你需要的節點。

querySelector 和 querySelectorAll 的使用非常的簡單,就像標題說到的一樣,它和 CSS 的寫法完全一樣,對於前端開發人員來說,這是難度幾乎為零的一次學習。假如我們有一個 id 為 test 的 DIV,為了獲取到這個元素,你也許會像下面這樣:

document.getElementById("test");

現在我們來試試使用新方法來獲取這個 DIV:

document.querySelector("#test");
document.querySelectorAll("#test")[0];

感覺區別不大是吧,但如果是稍微復雜點的情況,原始的方法將變得非常麻煩,這時候 querySelector 和 querySelectorAll 的優勢就發揮出來了。

例如:

html代碼:

<div class="emphasis">我是內容</div>
<div class="emphasis">我是內容</div>
<div class="emphasis">我是內容</div>
<div class="emphasis">我是內容</div>

js代碼:

var emphasisText = document.querySelectorAll(".emphasis");
for( var i = 0 , j = emphasisText.length ; i < j ; i++ ){
    emphasisText[i].style.fontWeight = "bold";
}

結果如圖:

這是原生方法,比起jquery速度快,缺點是IE6、7不支持。

W3C的規范與庫中的實現

querySelector:return the first matching Element node within the node’s subtrees. If there is no such node, the method must return null .(返回指定元素節點的子樹中匹配selector的集合中的第一個,如果沒有匹配,返回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. (返回指定元素節點的子樹中匹配selector的節點集合,采用的是深度優先預查找;如果沒有匹配的,這個方法返回空集合)

這在BaseElement 為document的時候,沒有什么問題,各瀏覽器的實現基本一致;但是,當BaseElement 為一個普通的dom Node的時候(支持這兩個方法的dom Node ),瀏覽器的實現就有點奇怪了,舉個例子:

<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);  // [span]
</script>

按照W3C的來理解,這個例子應該返回:element:null;elementList:[];因為作為baseElement的 testElement里面根本沒有符合selectors的匹配子節點;但瀏覽器卻好像無視了baseElement,只在乎selectors,也就是說此時baseElement近乎document;這和我們的預期結果不合,也許隨着瀏覽器的不斷升級,這個問題會得到統一口徑!

如果每次都這么長的選擇器感覺比較麻煩,那么可以這樣優化代碼:

var query = function(selector){
    return document.querySelector(selector);
};

調用方式:

var o = query("#shareOverlay");
o.style.zIndex = 80;
o.className = "overlay overlay-show";

html代碼:

<div id="shareOverlay"></div>

得到的結果:

<div id="shareOverlay" class="overlay overlay-show" style="z-index: 80;"></div>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM