成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

你所不了解的querySelector

freewolf / 2089人閱讀

摘要:而事實(shí)上,它會(huì)在的子代元素中匹配查詢條件。它們并不會(huì)相對(duì)于任何特定的元素,甚至不會(huì)相對(duì)于調(diào)用的元素。偽選擇器是相對(duì)當(dāng)前作用域進(jìn)行匹配的。它們是和的替代方法,存在父節(jié)點(diǎn)上。了解像這些坑很重要,因?yàn)閺乃鼈兊男袨橹泻茈y了解它們的實(shí)質(zhì)特性。

原文鏈接地址:http://blog.lxjwlt.com/front-...
筆者整理筆記:

1.API介紹

先看看MDN上怎么介紹這個(gè)API的:
概述
返回當(dāng)前文檔中匹配一個(gè)特定選擇器的所有的元素(使用深度優(yōu)先,前序遍歷規(guī)則這樣的規(guī)則遍歷所有文檔節(jié)點(diǎn)) .返回的對(duì)象類型是 NodeList.

語法

elementList = document.querySelectorAll(selectors);

elementList 是一個(gè)non-live的 NodeList 類型的對(duì)象.
selectors 是一個(gè)由逗號(hào)連接的包含一個(gè)或多個(gè)CSS選擇器的字符串.
如果 selectors參數(shù)中包含 CSS偽類 ,則返回一個(gè)空的elementList.

例子
下面的例子返回一個(gè)文檔中所有的class為"note"或者 "alert"的div元素.

var matches = document.querySelectorAll("div.note, div.alert");

注意
如果指定的選擇器不合法,則拋出一個(gè)SYNTAX_ERR 異常.
querySelectorAll()從WebApps API中引入.

WebKit 內(nèi)核的瀏覽器有一個(gè)bug: 如果 selectors參數(shù)中包含 CSS偽類 ,返回的elementList包含一個(gè) 元素,而不是空的.

2.你所不知道的

現(xiàn)代瀏覽器提供了querySelector和querySelectorAll這兩API。它們用來查詢匹配CSS選擇器的單個(gè)或多個(gè)元素。這類似CSS選擇器:用class或ID選取元素。如果你沒有用過它們,MDN上有非常棒的介紹。
想象下面的HTML頁面:




    
    

(1) document.querySelectorAll("div")返回頁面中所有div元素組成的節(jié)點(diǎn)列表(NodeList類型的對(duì)象),而document.querySelector("div.lonely")返回一個(gè)多帶帶的div元素。

(2)document元素支持querySelector和querySelectorAll,你可以在整個(gè)頁面文檔中查找元素。元素本身也支持querySelector和querySelectorAll,你可以查找該元素的子代元素。例如,下面的表達(dá)式會(huì)查找#my-id下的圖片子代元素(注意是子代而不是后代):

document.querySelector("#my-id").querySelectorAll("img")

在上述html頁面例子中,這個(gè)表達(dá)式將查詢到 而不會(huì)匹配

好好想想,下面這兩個(gè)表達(dá)式做了什么?

document.querySelectorAll("#my-id div div");
document.querySelector("#my-id").querySelectorAll("div div");

你可能想當(dāng)然地認(rèn)為它們是等價(jià)的。畢竟,第一個(gè)是查詢一個(gè)被#my-div下div包裹的div元素,而另一個(gè)是查詢一個(gè)被div包裹的div元素,而這個(gè)div是#my-id的子代元素。然而,它們返回了非常不一樣的結(jié)果:

document.querySelectorAll("#my-id div div").length === 1;
document.querySelector("#my-id").querySelectorAll("div div").length === 3;

這里到底是怎么回事?
這是因?yàn)?,element.querySelectorAll不是從element開始匹配元素的。而事實(shí)上,它會(huì)在element的子代元素中匹配查詢條件。因此,我們找到了三個(gè)div元素: div.lonely,div.outer,div.inner。我們找它們是因?yàn)樗鼈兌计ヅ鋎iv div選擇符,而且它們都是#my-id的子代元素。
我們要記住,querySelector/querySelectorAll下的CSS選擇器是絕對(duì)的。它們并不會(huì)相對(duì)于任何特定的元素,甚至不會(huì)相對(duì)于調(diào)用querySelectorAll的元素。
這甚至對(duì)調(diào)用querySelectorAll的元素的外部元素生效。例如,這個(gè)選擇器:

document.querySelector("#my-id").querySelector("div div div")

...在這個(gè)代碼段(JSbin)中匹配div.inner:



  
    

這個(gè)API讓我覺得很意外,我所問過的前端工程師也同意我的觀點(diǎn)。然而,這個(gè)并不是一個(gè)bug。這就是規(guī)范定義它的工作方式,而瀏覽器也一致地按這種方式實(shí)現(xiàn)了它。John Resig 評(píng)論道,當(dāng)這個(gè)規(guī)范出來的時(shí)候,他和其他人都感到這個(gè)API的行為相當(dāng)?shù)脑幃悺?br>如果你無法輕易地將選擇器重寫為“絕對(duì)的”形式,這里有兩個(gè)選擇::scopeCSS偽選擇器和query/queryAll。
:scope偽選擇器是相對(duì)當(dāng)前作用域進(jìn)行匹配的。這名字來自CSS的作用域標(biāo)識(shí)符,它能夠限定樣式在文檔中的范圍。
document.querySelector("#my-id").querySelectorAll(":scope div div");
不幸的是,支持作用域CSS和:scope偽選擇器的瀏覽器非常少。只有最新的火狐瀏覽器默認(rèn)支持它。

Chrome和Opera需要隱藏的很深的實(shí)驗(yàn)功能來開啟它。Safari的實(shí)現(xiàn)則漏洞白出。而IE干脆沒有實(shí)現(xiàn)。
另一個(gè)選擇是element.query/queryAll。它們是querySelector和querySelectorAll的替代方法,存在DOM父節(jié)點(diǎn)上。它們也接受選擇器,但這些選擇器的解析是相對(duì)于調(diào)用這些方法的元素。不幸的是,這些方法更加模糊不清:MDN或caniuse.com里都沒有提及它們,并且2015年6月18日的DOM4草案中也不見蹤影。他們?nèi)匀淮嬖谟谝粋€(gè)較舊的版本中,于2014年二月4日,也出現(xiàn)在WHATWG 現(xiàn)存文檔中。他們已經(jīng)被至少兩個(gè)擴(kuò)展兼容庫實(shí)現(xiàn):
? Dom4
? dom-elements
總的來說,DOM規(guī)范不是總是清晰明了的。了解像這些坑很重要,因?yàn)閺乃鼈兊男袨橹泻茈y了解它們的實(shí)質(zhì)特性。幸運(yùn)的是,你可以重寫你的選擇器,所以沒什么關(guān)系。如果你無法重寫選擇器,這里會(huì)有一些實(shí)現(xiàn)庫為你提供你要的現(xiàn)代API。另外,類似jQuery的庫會(huì)為你提供一套穩(wěn)定的友好的接口來查找DOM元素。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/80685.html

相關(guān)文章

  • 前端面試所不知道系列

    摘要:請(qǐng)注意是創(chuàng)建一個(gè)全局對(duì)象的屬性,而不是聲明了一個(gè)全局變量。由于變量聲明自帶不可刪除屬性,比較跟,前者是變量聲明,帶不可刪除屬性,因此無法被刪除后者為全局變量的一個(gè)屬性,因此可以從全局變量中刪除。下期預(yù)告前端面試你所不知道系列偽類和偽元素 寫在開始 又到了一年的伊始,很多人可能因?yàn)楦鞣N原因想換一份工作,而找工作難免遇到各種各樣頭痛的面試題,于是我打算寫一個(gè)系列,關(guān)于面試中最常見或者前端一...

    Julylovin 評(píng)論0 收藏0
  • 所不知道 ? PHP 自動(dòng)加載

    前言 很多的小伙伴在,學(xué)習(xí) PHP 的時(shí)候最早面對(duì)的問題之一就是 require 、 include 和 require_once 、include_once 的相愛相殺。 在了解了它們相愛相殺的故事后,往往就開始使用起了框架??蚣芄倘皇歉苫畹暮霉ぞ?,但是你知道你平時(shí) new 一個(gè)新類的時(shí)候,發(fā)生了什么嗎?有想過為什么我們 遵循規(guī)范 就會(huì)自動(dòng)的幫我們做好一切的加載嗎? 讓我們一切來探索發(fā)現(xiàn)其中的奧...

    sixgo 評(píng)論0 收藏0
  • 所不知道 ? PHP POST

    0.說明 大叔 :二翔 我們要做一個(gè)微信公眾號(hào)哦。我來教你大概的流程好不好?(開啟裝逼模式中 ) 二翔 :好啊,快講快講。(無限期待中 ) 大叔 :你知道 application/x-www-form-urlencoded是什么嘛? 二翔 :啊咧咧? 大叔 :你知道 php 怎么獲得 raw? 二翔 :啊咧咧? 大叔 :用下面這種方法來實(shí)現(xiàn)。 echo file_get_...

    hlcc 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<