【前端】強大的javascript原生選擇器querySelector 和 querySelectorAll

来源:http://www.cnblogs.com/dragonir/archive/2017/09/09/7499639.html
-Advertisement-
Play Games

querySelector 和 querySelectorAll 在傳統的 JavaScript 開發中,查找 DOM 往往是開發人員遇到的第一個頭疼的問題,原生的 JavaScript 所提供的 DOM 選擇方法並不多,僅僅局限於通過 tag, name, id 等方式來查找,這顯然是遠遠不夠的, ...


querySelector 和 querySelectorAll

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

querySelector

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

document.getElementById("test");

  

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

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

  

  獲取文檔中 class=”example” 的第一個 <p> 元素:

document.querySelector("p.example");

  

  獲取文檔中有 “target” 屬性的第一個 <a> 元素:

document.querySelector("a[target]");

 

  假定你選擇了兩個選擇器: <h2> 和 <h3> 元素。 以下代碼將為文檔的第一個 <h2> 元素添加背景顏色:

<h2>A h2 element</h2>
<h3>A h3 element</h3>
document.querySelector("h2, h3").style.backgroundColor = "red";//返回h2或者h3的首個元素

  

  但是,如果文檔中 <h3> 元素位於 <h2> 元素之前,<h3> 元素將會被設置指定的背景顏色。

<h3>A h3 element</h3>
<h2>A h2 element</h2>
document.querySelector("h2, h3").style.backgroundColor = "red";

  使用這兩個方法無法查找帶偽類狀態的元素,比如querySelector(':hover')不會得到預期結果。

querySelectorAll

  該方法返回所有滿足條件的元素,結果是個nodeList集合。查找規則與前面所述一樣。

elements = document.querySelectorAll('div.foo');//返回所有帶foo類樣式的div

  

但需要註意的是返回的nodeList集合中的元素是非實時(no-live)的,想要區別什麼是實時非實時的返回結果,請看下例:

<div id="container">
    <div></div>
    <div></div>
</div>
//首先選取頁面中id為container的元素
container=document.getElementById('#container');
console.log(container.childNodes.length)//結果為2
//然後通過代碼為其添加一個子元素
container.appendChild(document.createElement('div'));
//這個元素不但添加到頁面了,這裡的變數container也自動更新了
console.log(container.childNodes.length)//結果為3

  通過上面的例子就很好地理解了什麼是會實時更新的元素。document.getElementById返回的便是實時結果,上面對其添加一個子元素後,再次獲取所有子元素個數,已經由原來的2個更新為3個(這裡不考慮有些瀏覽器比如Chrome會把空白也解析為一個子節點)。

  感覺區別不大是吧,但如果是稍微複雜點的情況,原始的方法將變得非常麻煩,這時候 querySelector 和 querySelectorAll 的優勢就發揮出來了。比如接下來這個例子,我們將在 document 中選取 class 為 test 的 div 的子元素 p 的第一個子元素,當然這很拗口,但是用本文的新方法來選擇這個元素,比用言語來描述它還要簡單。

document.querySelector("div.test>p:first-child");
document.querySelectorAll("div.test>p:first-child")[0];

  

  我們使用 querySelectorAll 給所有 class 為 emphasis 的元素加粗顯示。

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

  這是原生方法,比起jquery速度快

關於轉義

  我們知道反斜杠是用來轉義用的,比如在字元串里我們想表示空字元就使用'\b',換行'\n'。同樣,在提供給querySelector和querySelectorAll的參數也支持轉義,瞭解這點非常重要。

  先看個例子,比如我們有個div它的樣式類為'foo:bar',當然我知道你一般不會這樣寫。當我們需要選擇它的時候,就需要將其中的冒號進行轉義,否則拋錯。

<div class="foo:bar"></div>

  

這裡寫圖片描述

  瀏覽器報怨表示不是一個合法的選擇語句。

  同時,有趣的事情來了,或許你以為將冒號直接轉義就解決問題了。

這裡寫圖片描述

  同樣,也表示非法。原因就在於反斜杠在字元串中本身就表示轉義的意思,它於冒號結合轉不出東西來,於是拋錯。

  所以正確的做法是將反斜杠轉義後'.foo\:bar'再傳遞給querySelector,後者在接收到'.foo\:bar'這個參數後,字元串將兩個反斜杠轉義成一個,然後querySelector前面得到的一個反斜杠與冒號結合進行轉義得到正確結果。

這裡寫圖片描述

  也就是說經歷兩次轉義,一次是字元串當中,一次是querySelector解析參數時。

  理解這點後,可以來看一個更有趣的例子了。比如我們要選擇類名裡面含反斜杠的元素。是的,我們需要一共使用四個反斜杠!才能正常工作。

<div class="foo\bar"></div>

這裡寫圖片描述


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、概述 和select下拉列表相比,jquery+css實現的下拉列表具有更好的靈活性,第二部分的代碼為下拉列表的實現。 二、代碼 下拉列表效果如下: 下拉列表的選項為動態追加,使用on方法,採用事件委派機制,響應選項的單擊事件。 經過測試,以下代碼在Firefox 55.0和Safari 10. ...
  • 還記得我們上文中的index.html文件嗎? 那裡面的script標簽還是寫死的index.bundle.js文件,那麼怎麼把他們變成動態的index.html文件,這個動態生成的index.html文件會動態引入我們打包後生成的js文件呢?,我們可以使用插件html-webpack-plugin ...
  • 一、定義 用來描述或匹配一系列符合某個規則的字元串信息的字元串。 通常用來檢驗字元串是否符合某些規則,或者匹配(替換)被操作的字元串中的某些信息。 二、基本語法 1.以“/”開始,以另一個“/”結束 2.結束符“/”後可以有g(global-在整個字元串中搜索)、i(ignore-忽略大小寫)、m( ...
  • 本文繼續接著上文,繼續寫下webpack.config.js的其他配置用法. 一、把兩個文件打包成一個,entry怎麼配置? 在上文中的webpack.dev.config.js中,用數組配置entry webpack.dev.config.js文件代碼: 然後在src/js目錄下麵新建一個calc ...
  • 在標準流中,一個塊級元素在水平方向會自動伸展,直到包含它的元素的邊界;而在豎直方向和兄弟元素依次排列,不能併排。使用“浮動”方式後,塊級元素的表現就會有所不同。 CSS中有一個float屬性,預設為none,也就是標準流通常的情況。如果將float屬性的值設置為left或right,元素就會向其父元 ...
  • 本文由segementfalt上的一道instanceof題引出: var str = new String("hello world"); console.log(str instanceof String);//true console.log(String instanceof Functio ...
  • Angular Js 的初步認識和使用 一: 1.模塊化 定義模塊和控制器 ng-app="myapp" controller="myctrl" 指定模型 ng-model="" 獲取的屬性值: ng-bind="屬性名"或者{{屬性名}} 2.初始化模塊(在Script中進行) var myapp ...
  • 1.1 DOM操作對頁面的影響 通過js操作DOM的代價很高,影響頁面性能的主要問題有如下幾點: 訪問和修改DOM元素 修改DOM元素的樣式,導致重繪或重排 通過對DOM元素的事件處理,完成與用戶的交互功能 訪問和修改DOM元素 修改DOM元素的樣式,導致重繪或重排 通過對DOM元素的事件處理,完成 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...