上下文
我已经构建了一个jQuery插件,我正在以一种方式将DOM元素存储在一个数组中,主要是为了能够在这些元素旁边存储更多信息,而不必使用不那么快的数据( ).
该数组看起来像:
[ { element: DOMElement3,additionalData1: …,additionalData2: … },{ element: DOMElement1,{ element: DOMElement2,]
这个插件的工作方式阻止我以可预测的顺序将这些元素推送到数组,这意味着DOMElement3实际上可以在低于DOMElement2的索引处找到它自己.
但是,我需要按照它们包含的DOM元素在DOM中出现的顺序对这些数组元素进行排序.前面的示例数组一旦排序,将如下所示:
[ { element: DOMElement1,{ element: DOMElement3,]
当然,如果DOMElement1出现在DOM中的DOMElement2之前,而DOMElement2出现在DOMElement3之前.
丢弃的解决方案
jQuery add()
方法以与DOM中出现的顺序相同的顺序返回一组DOM元素.我可以使用它,但要求是我使用jQuery集合 – 这意味着我必须重构上述插件的大部分以使用不同的存储格式.这就是为什么我认为这是最后的解决方案.
另一种方法?
我想象map()
和一种与每个DOM元素相关联的全局DOM索引都可以完成这个技巧,但似乎没有这样的“全局DOM索引”.
解决方法
有一个非常有用的函数叫做
compareDocumentPosition
,它根据两个元素相对于彼此的位置返回一个数字.您可以在.sort回调中使用它:
yourArray.sort(function(a,b) { if( a === b) return 0; if( !a.compareDocumentPosition) { // support for IE8 and below return a.sourceIndex - b.sourceIndex; } if( a.compareDocumentPosition(b) & 2) { // b comes before a return 1; } return -1; });