2010-10-22 51 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这是再快一点。

相关问题