javascript比較文檔位置

來源:互聯網
上載者:User

1、DOMElement.contains(DOMNode)

這個方法起先用在 IE ,用來確定 DOM Node 是否包含在另一個 DOM Element 中。

當嘗試最佳化 CSS 選取器遍曆(像:“#id1 #id2”),這個方法很有用。你可以通過 getElementById 得到元素,然後使用 .contains() 確定 #id1 實際上是否包含 #id2。

注意點:如果 DOM Node 和 DOM Element 相一致,.contains() 將返回 true ,雖然,一個元素不能包含自己。

這裡有一個簡單的執行封裝,可以運行在: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() 強大。這個方法的一個可能應用是排序 DOM Node 成一個詳細精確的順序。

使用這個方法你可以確定關於一個元素位置的一連串的資訊。所有的這些資訊將返回一個位元碼(Bit,位元,亦稱二進位位)。

對於那些,人們知之甚少。位元碼是將多重資料存放區為一個簡單的數字(譯者註:0 或 1)。你最終開啟 / 關閉個別數目(譯者註:開啟/關閉對應 0 /1),將給你一個最終的結果。

這裡是從 NodeA.compareDocumentPosition(NodeB) 返回的結果,包含你可以得到的資訊。

Bits Number Meaning
000000 0 元素一致
000001 1 節點在不同的文檔(或者一個在文檔之外)
000010 2 節點 B 在節點 A 之前
000100 4 節點 A 在節點 B 之前
001000 8 節點 B 包含節點 A
010000 16 節點 A 包含節點 B
100000 32 瀏覽器的私人使用

現在,這意味著一個可能的結果類似於:

<div id="a">
<div id="b"></div>
</div>
<script>
alert( document.getElementById("a").compareDocumentPosition(document.getElementById("b")) == 20);
</script>
一旦一個節點 A 包含另一個節點 B,包含 B(+16) 且在 B 之前(+4),則最後的結果是數字 20 。如果你查看位元發生的變化,將增加你的理解。

000100 (4) + 010000 (16) = 010100 (20)

這個,毫無疑問,有助於理解單個最混亂的 DOM API 方法。當然,他的價值當之無愧的。

現在,DOMNode.compareDocumentPosition 在 Firefox 和 Opera 中是可用的。然而,有一些技巧,我們可以用來在 IE 中執行他。

// 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)的結果。IE 還有一個 .sourceIndex 屬性在所有的 DOM Element 對應著元素在文檔中的位置,例如:document.documentElement.sourceIndex == 0。因為我們有這個資訊,我們可以完成兩個 compareDocumentPosition 難題:在前面(+2)和在後面(+4)。另外,如果一個元素不在當前的文檔,.sourceIndex 將等於 -1,這個給我們另外一個回答(+1)。最後,通過這個過程的推斷,我們可以確定如果一個元素等於他本身,返回一個空的位元碼(+0)。

這個函數可以在 Internet Explorer、Firefox 和 Opera 中運行。但在 Safari 中卻有殘缺功能(因為他只有 contains() 方法,而沒有 .sourceIndex 屬性。我們只能得到 包含(+16),被包含(+8),其他的所有結果都將返回(+1)代表一個斷開)。

PPK 提供了一個關於通過建立一個 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);
});
}
我們現在可以使用他來按次序構建一個網站的目錄:

getElementsByTagNames("h1, h2, h3");
雖然 Firefox 和 Opera 都採取了一些主動落實這一方法。我依然期待看到更多的瀏覽器進入,以協助向前推動。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.