使用jQuery或直接的JavaScript,我正在寻找,找到最左边的DIV(或者一般地与在任一轴的最小或最大位置的DOM元素)的最佳方式。最有效的方法来找到最左边的div?
到目前为止,我有两个解决方案:
- 通过迭代,我要考虑的div对象,节约发现最小的左侧位置。
- 构建一个对象数组,并使用javascript的sort()函数与比较函数查看左侧属性,然后选择第0个元素。
我知道解决方案1是O(N),但我不确定sort()函数在大多数浏览器中的效率是多少,或者是否有完全不同的方法。
使用jQuery或直接的JavaScript,我正在寻找,找到最左边的DIV(或者一般地与在任一轴的最小或最大位置的DOM元素)的最佳方式。最有效的方法来找到最左边的div?
到目前为止,我有两个解决方案:
我知道解决方案1是O(N),但我不确定sort()函数在大多数浏览器中的效率是多少,或者是否有完全不同的方法。
考虑一下:
你认为什么是最快的? :)
干得好先生,好打。 – annakata 2010-10-22 15:16:59
大概不会比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;
}
选项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这是再快一点。
排序是_very_快。这会不会是瓶颈,**假设你的比较函数不会做任何不必要的工作。** – 2010-10-22 13:58:07