使用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