亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

章節
問答
課簽
筆記
評論
占位
占位

querySelector的兼容處理

上一小節提到了querySelectorAll提供一個上下文范圍,但是瀏覽器無視了這個上下文,默認還是類似document的處理。

那么針對這種情況如何兼容?

Andrew Dupont提出了一個解決方案,原理很簡單:

context.querySelector
在上下文調用的context元素上指定一個id,通過這個限制范圍,這個方法用的非常廣泛。

我們看來自jQuery2.1.1的代碼:

先看看jQuery最終的實現context.querySelectorAll用的上下文調用:

$('#test2').click(function() {
 //代碼右圖
}

代碼可見newContext可能是document || 提供的一個上下文。

如: var context = document.querySelector('.aaron'); 此時的上下文即是<div class= "aaron">節點。

context.querySelectorAll('.aaron span') 在文檔內找全部符合選擇器描述的節點不包括Element本身。

最關鍵的地方其實就是通過給<div class= "aaron">加一個id用來限制范圍,所以處理就變成了:

<div class= "aaron" id="[id='sizzle-1405486760710']">
context.querySelectorAll('[id='sizzle-1405486760710'] .aaron span')

注意finally總是執行context.removeAttribute("id"),意味著我們在之前的處理強制加了一個id,反推hack的手法,selectors前面指定上下文的的id,限制匹配的范圍。

所以整個處理方式,我們可以總結幾點:

1. 關鍵是給context設置一個id,所以上下文content,就會存在這個id限制范圍。

2. 拼接出查詢的選擇器,附上這個ID前綴

newSelector: "[id='sizzle-1405486760710'] div[class='text']"

3. 查詢

newContext.querySelectorAll( newSelector )

4. 因為強制加了ID,所以需要刪除

context.removeAttribute("id");

這樣就達到目的范圍限制context.querySelectorAll了。

querySelectorAll在選擇器上存在的問題,具體我是看jQuery的源碼相關處理,基本都是IE8上的問題。jQuery對兼容的判斷,都是采用的功能判斷直接特性檢測,偽造一個真實的環境測試支持度,針對querySelectorAll選取存在的問題之后分析。

任務

?不會了怎么辦
||

提問題

寫筆記

公開筆記
提交
||

請驗證,完成請求

由于請求次數過多,請先驗證,完成再次請求

加群二維碼

打開微信掃碼自動綁定

您還未綁定服務號

綁定后可得到

  • · 粉絲專屬優惠福利
  • · 大咖直播交流干貨
  • · 課程更新,問題答復提醒
  • · 賬號支付安全提醒

收藏課程后,能更快找到我哦~

使用 Ctrl+D 可將課程添加到書簽

邀請您關注公眾號
關注后,及時獲悉本課程動態

舉報

0/150
提交
取消
全部 精華 我要發布
全部 我要發布
最熱 最新
只看我的

手記推薦

更多

本次提問將花費2個積分

你的積分不足,無法發表

為什么扣積分?

本次提問將花費2個積分

繼續發表請點擊 "確定"

為什么扣積分?