2015-08-13 29 views
3

我有Element秒的陣列,我希望他們在文檔順序。我知道這在XPath中很容易實現,但我必須實現的邏輯對於單個表達式來說有點複雜。排序元素的文檔順序在JavaScript

我發現Node.compareDocumentPosition(),但它會產生相當多的組合的位掩碼,所以不是很理想的一個比較。

正如我最後的解決辦法,我大概可以添加一個隨機屬性添加到陣列中的所有元素,並再次使用XPath選擇它們,但我寧願不這樣做,如果可能的。

+2

如何數組建?是否按照文檔順序構建數組,然後在事件之後將其排序? – atmd

+0

@atmd這些元素是一些現有函數調用的結果。我在理論上可文檔順序選擇它們,但代碼不會看任何比我提到的,並增加了不必要的維護負擔黑客更好。 –

+0

只是想想,也許是蠻力的方法來重新選擇從文檔中的元素?根據你如何爲每個(也是唯一)元素確定一個精確的選擇器,你可以在列表中運行並構建一個選擇器來抓取它們。在這個JQuery中可能會導致類似這樣的結果: $('#id20,#id5,#id12,#id7')... JQuery將按照文檔順序返回集合,而不是按照選擇器中指定的順序。 – wwwmarty

回答

9

我不一定同意document.compareDocumentPosition()是不夠的比較。你爲什麼認爲這不理想?

var elementArray = []; 
 

 
elementArray.push(document.getElementById('div3')); 
 
elementArray.push(document.getElementById('div2')); 
 
elementArray.push(document.getElementById('div4')); 
 
elementArray.push(document.getElementById('div1')); 
 

 
function documentPositionComparator (a, b) { 
 
    if (a === b) { 
 
    return 0; 
 
    } 
 

 
    var position = a.compareDocumentPosition(b); 
 

 
    if (position & Node.DOCUMENT_POSITION_FOLLOWING || position & Node.DOCUMENT_POSITION_CONTAINED_BY) { 
 
    return -1; 
 
    } else if (position & Node.DOCUMENT_POSITION_PRECEDING || position & Node.DOCUMENT_POSITION_CONTAINS) { 
 
    return 1; 
 
    } else { 
 
    return 0; 
 
    } 
 

 
} 
 

 
console.log('unsorted::', elementArray); 
 
console.log('sorted::', elementArray.sort(documentPositionComparator));
<div id="div1">Div 1 
 
    <div id="div2">Div 2 
 
    <div id="div3">Div 3</div> 
 
    <div id="div4">Div 4</div> 
 
    </div> 
 
</div>

+0

好的。代碼看起來並不像我想的那樣糟糕。 –