javascript contains和compareDocumentPosition 方法來確定是否HTML節(jié)點間的關(guān)系
從那起,我已經(jīng)對這些方法做了大量的研究,并且已經(jīng)在很多場合使用他們。在很多任務(wù)中,他們被證明是非常有用的(特別關(guān)于結(jié)構(gòu)的抽象 DOM 選擇器)。
1、DOMElement.contains(DOMNode)
這個方法起先用在 IE ,用來確定 DOM Node 是否包含在另一個 DOM Element 中。
當嘗試優(yōu)化 CSS 選擇器遍歷(像:“#id1 #id2”),這個方法很有用。你可以通過 getElementById 得到元素,然后使用 .contains() 確定 #id1 實際上是否包含 #id2。
注意點:如果 DOM Node 和 DOM Element 相一致,.contains() 將返回 true ,雖然,一個元素不能包含自己。
這里有一個簡單的執(zhí)行包裝,可以運行在:Internet Explorer, Firefox, Opera, and Safari。
function contains(a, b) {
return a.contains ? a != b && a.contains(b) : !!(a.compareDocumentPosition(arg) & 16);
}
2、NodeA.compareDocumentPosition(NodeB)
這個方法是 DOM Level 3 specification 的一部分,允許你確定 2 個 DOM Node 之間的相互位置。這個方法比 .contains() 強大。這個方法的一個可能應(yīng)用是排序 DOM Node 成一個詳細精確的順序。
使用這個方法你可以確定關(guān)于一個元素位置的一連串的信息。所有的這些信息將返回一個比特碼(Bit,比特,亦稱二進制位)。
對于那些,人們知之甚少。比特碼是將多重數(shù)據(jù)存儲為一個簡單的數(shù)字(譯者注:0 或 1)。你最終打開 / 關(guān)閉個別數(shù)目(譯者注:打開/關(guān)閉對應(yīng) 0 /1),將給你一個最終的結(jié)果。
這里是從 NodeA.compareDocumentPosition(NodeB) 返回的結(jié)果,包含你可以得到的信息。
Bits Number Meaning
000 0 元素一致
001 1 節(jié)點在不同的文檔(或者一個在文檔之外)
010 2 節(jié)點 B 在節(jié)點 A 之前
100 4 節(jié)點 A 在節(jié)點 B 之前
000 8 節(jié)點 B 包含節(jié)點 A
000 16 節(jié)點 A 包含節(jié)點 B
000 32 瀏覽器的私有使用
現(xiàn)在,這意味著一個可能的結(jié)果類似于:
<div id="a">
<div id="b"></div>
</div>
<script>
alert( document.getElementById("a").compareDocumentPosition(document.getElementById("b")) == 20);
</script>
一旦一個節(jié)點 A 包含另一個節(jié)點 B,包含 B(+16) 且在 B 之前(+4),則最后的結(jié)果是數(shù)字 20 。如果你查看比特發(fā)生的變化,將增加你的理解。
100 (4) + 010000 (16) = 010100 (20)
這個,毫無疑問,有助于理解單個最混亂的 DOM API 方法。當然,他的價值當之無愧的。
現(xiàn)在,DOMNode.compareDocumentPosition 在 Firefox 和 Opera 中是可用的。然而,有一些技巧,我們可以用來在 IE 中執(zhí)行他。
// Compare Position - MIT Licensed, John Resig
function comparePosition(a, b){
return a.compareDocumentPosition ?
a.compareDocumentPosition(b) :
a.contains ?
( a != b && a.contains(b) && 16 ) +
( a != b && b.contains(a) && 8 ) +
( a.sourceIndex >= 0 && b.sourceIndex >= 0 ?
(a.sourceIndex < b.sourceIndex && 4 ) +
(a.sourceIndex > b.sourceIndex && 2 ) :
1 ) :
0;
}
IE 提供給我們一些可以使用的方法和屬性。開始,使用 .contains() 方法(如我們前面所討論的),以便給我們包含(+16)或者被包含(+8)的結(jié)果。IE 還有一個 .sourceIndex 屬性在所有的 DOM Element 對應(yīng)著元素在文檔中的位置,例如:document.documentElement.sourceIndex == 0。因為我們有這個信息,我們可以完成兩個 compareDocumentPosition 難題:在前面(+2)和在后面(+4)。另外,如果一個元素不在當前的文檔,.sourceIndex 將等于 -1,這個給我們另外一個回答(+1)。最后,通過這個過程的推斷,我們可以確定如果一個元素等于他本身,返回一個空的比特碼(+0)。
這個函數(shù)可以在 Internet Explorer、Firefox 和 Opera 中運行。但在 Safari 中卻有殘缺功能(因為他只有 contains() 方法,而沒有 .sourceIndex 屬性。我們只能得到 包含(+16),被包含(+8),其他的所有結(jié)果都將返回(+1)代表一個斷開)。
PPK 提供了一個關(guān)于通過創(chuàng)建一個 getElementsByTagNames 方法使新功能可以被使用的很棒的例子。讓我們改編他到我們的新方法中:
// Original by PPK quirksmode.org
function getElementsByTagNames(list, elem) {
elem = elem || document;
var tagNames = list.split(','), results = [];
for ( var i = 0; i < tagNames.length; i++ ) {
var tags = elem.getElementsByTagName( tagNames[i] );
for ( var j = 0; j < tags.length; j++ )
results.push( tags[j] );
}
return results.sort(function(a, b){
return 3 - (comparePosition(a, b) & 6);
});
}
我們現(xiàn)在可以使用他來按次序構(gòu)建一個站點的目錄:
getElementsByTagNames("h1, h2, h3");
雖然 Firefox 和 Opera 都采取了一些主動落實這一方法。我依然期待看到更多的瀏覽器進入,以幫助向前推動
- JavaScript中擴展Array contains方法實例
- js contains方法實現(xiàn)代碼
- JS中判斷某個字符串是否包含另一個字符串的五種方法
- js判斷數(shù)組是否包含某個字符串變量的實例
- JS給Array添加是否包含字符串的簡單方法
- jsp 判斷l(xiāng)ist是否包含string的實現(xiàn)方法
- jstl中判斷l(xiāng)ist中是否包含某個值的簡單方法
- 判斷數(shù)組是否包含某個元素的js函數(shù)實現(xiàn)方法
- JavaScript判斷數(shù)組是否包含指定元素的方法
- JavaScript判斷一個字符串是否包含指定子字符串的方法
- js判斷一個字符串是否包含一個子串的方法
- JS檢測輸入字符是否包含非法字符的示例代碼
- 使用js判斷數(shù)組中是否包含某一元素(類似于php中的in_array())
- 編寫js擴展方法判斷一個數(shù)組中是否包含某個元素
- javascript 判斷字符串是否包含某字符串及indexOf使用示例
- javascript 判斷數(shù)組是否已包含了某個元素的函數(shù)
- JS實現(xiàn)判斷數(shù)組是否包含某個元素示例
- javascript中contains是否包含功能實現(xiàn)代碼(擴展字符、數(shù)組、dom)
相關(guān)文章
javascript getBoundingClientRect() 來獲取頁面元素的位置的代碼[修正版]
該方法已經(jīng)不再是IE Only了,F(xiàn)F3.0+和Opera9.5+已經(jīng)支持了該方法,可以說在獲得頁面元素位置上效率能有很大的提高,在以前版本的Opera和Firefox中必須通過循環(huán)來獲得元素在頁面中的絕對位置。2009-05-05JavaScript和jQuery獲取input框的絕對位置實現(xiàn)方法
下面小編就為大家?guī)硪黄狫avaScript和jQuery獲取input框的絕對位置實現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-10-10jquery SweetAlert插件實現(xiàn)響應(yīng)式提示框
為了滿足用戶體驗度,使用SweetAlert插件實現(xiàn)響應(yīng)式提示框效果非常好,下面通過這篇文章給大家介紹jquery SweetAlert插件實現(xiàn)響應(yīng)式提示框,需要的朋友可以參考下2015-08-08JavaScript?賦值,淺復(fù)制和深復(fù)制的區(qū)別
這篇文章主要介紹了JavaScript?賦值,淺復(fù)制和深復(fù)制的區(qū)別,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下2022-05-05ionic中的$ionicPlatform.ready事件中的通用設(shè)置
$ionicPlatform.ready事件是用于檢測當前的平臺是否就緒的事件,相當于基于document的deviceready事件, 在app中一些通用關(guān)于設(shè)備的設(shè)置必須在這個事件中處理2017-06-06