2010-10-22 87 views
2

使用jQuery或直接的JavaScript,我正在尋找,找到最左邊的DIV(或者一般地與在任一軸的最小或最大位置的DOM元素)的最佳方式。最有效的方法來找到最左邊的div?

到目前爲止,我有兩個解決方案:

  1. 通過迭代,我要考慮的div對象,節約發現最小的左側位置。
  2. 構建一個對象數組,並使用javascript的sort()函數與比較函數查看左側屬性,然後選擇第0個元素。

我知道解決方案1是O(N),但我不確定sort()函數在大多數瀏覽器中的效率是多少,或者是否有完全不同的方法。

+0

排序是_very_快。這會不會是瓶頸,**假設你的比較函數不會做任何不必要的工作。** – 2010-10-22 13:58:07

回答

2

考慮一下:

  1. 您跟蹤一個元素和一個位置,你一旦
  2. 您跟蹤所有元素和訪問所有訪問每一個元素多次因爲排序

你認爲什麼是最快的? :)

+0

幹得好先生,好打。 – annakata 2010-10-22 15:16:59

2

大概不會比O(n)做得更好,最好的做法是純粹的排序是O(nlogn)。最快的方法是走DOM。我會調用getElementsByTagName(「div」)並遍歷最左邊的元素。

function findLeftMostDiv() { 
    var leftest = { "left": 999999999999, elem: null }; 
    var divs = document.getElementsByTagName("div"); 

    for(i=0; i<divs.length; i++) { 
     var div = divs[i]; 
     var curleft = findPos(div); 
     if(curleft < leftest.left) { 
      leftest.left = curleft; 
      leftest.elem = div;  
     } 
    } 
    return leftest.elem;    
} 

function findPos(obj) { 
    var curleft=0; 
    if(obj.offsetParent) { 
     do { 
      curleft += obj.offsetLeft; 
     } while (obj = obj.offsetParrent); 
    } 
    return curleft; 
} 
2

選項1:遍歷它只有一次

var $smallest = {left: 000000000, item: null}; 
var $left = 0; 
$('selector').each(function(){ 
    $left = $(this).offset().left; 
    if ($left < $smallest.left) 
    { 
     $smallest.left = $left; 
     $smallest.item = this; 
    } 
}); 

選項2:遍歷它至少兩次

var $array = []; 
$('selector').each(function(){ 
    var $this = $(this); 
    $array.push({left: $this.offset().left, item: this}); 
}); 
$array.sort(function(a,b){ 
    if (a.left < b.left) return -1; 
    if (a.left > b.left) return 1; 
    return 0; 
}); 
// smallest is $array[0] 

選項1總是快在這種情況下,因爲你只有在選擇時對它進行排序,在這種情況下排序幾乎是免費的。

編輯:當然,使用只有DOM這是再快一點。

相關問題