2013-01-18 37 views
0

在我寫的Web應用程序中,我有一系列創建網格的div。根據用戶輸入,網格是Y div的X div。使用jQuery懸停功能,我想改變一定距離內所有周圍div的背景顏色。基本上,如果我將鼠標懸停在一個div上,所有4行4列內的div也應該改變其背景顏色。我可以得到這個功能正常,但是當網格變成32×128的div時,存在真正的性能問題,並且懸停效果明顯滯後於鼠標。我幾乎可以肯定,這是因爲DOM中的大量類似的div的,因爲這個問題是不是有當電網是像30 30點如何在使用jQuery懸停的同時提高效率/速度?

這是我的HTML的基本結構:

<div class="table_area"> 
    <div class="table_row" id="row-0"> 
     <div class="cap" data-row="0" data-column="0"></div> 
     <div class="cap" data-row="0" data-column="1"></div> 
     ... 
    </div> 
    <div class="table_row" id="row-1"> 
     <div class="cap" data-row="1" data-column="0"></div> 
     <div class="cap" data-row="1" data-column="1"></div> 
     ... 
    </div> 
    ... 
</div> 

爲了加速搜索DOM,我已經將每一行添加到數組中。因此,$('div.table_row[data-row="0"]')將在arr[0]。所以當第8行的div被徘徊時,我只需檢查arr[4]arr[12]以獲取必要的div。

我認爲這會加快這個過程,因爲我消除了大量的搜索,但懸停中仍然存在非常明顯的滯後。

有沒有什麼公然錯誤的我如何設置?如果有問題,我正在使用最新版本的Chrome。

+1

小心創建一個jsfiddle.net你有什麼? –

+0

你可以設置一個小演示嗎?可能還有其他方面可以優化。 –

+0

分享一些代碼如何? –

回答

0

如果你添加一個類到每個瓶蓋,就可以動態地建立一個巨大的選擇:

var sel = ""; 
$(".cap").hover(function() { 
    var row = $(this).data("row"); 
    var col = $(this).data("column"); 
    sel = ""; 
    for(var i=row-2; i<=row+2; i++) 
    { 
     for(var j=col-2; j<=col+2; j++) 
     { 
     sel += ".r" + i + ".c" + j + ","; 
     } 
    } 
    sel = sel.slice(0,-1); 
    $(sel).css("background-color","blue"); 
},function() { 
    $(sel).css("background-color","white"); 
    }); 
}); 

例子:http://jsbin.com/izeyal/38/edit

由於我是動態創建的行和列,我也加入IDS到每一行,你可以通過改變選擇生成的代碼,如果你想使用的測試:

sel += "#r" + i + "c" + j + ","; 

爲了完整起見,我的代碼用於生成網格:

for(i=0; i<128; i++) 
    { 
    var newRow = $('<div/>', { 
    id: 'row-' + i 
}).appendTo('.table_area'); 
    for (j=0; j<32; j++) 
    { 
     var rowid= "r" +i + "c" + j; 
     $('<div/>', {id: rowid }).data("row",i).data("column",j).addClass("cap r" + i + " c" + j).appendTo(newRow); 
    } 
    } 
+0

謝謝!我相信這是最快速響應,我將以我設置div的分組方式來實現它!我不知道同樣的選擇器也可以用於鼠標出口。說得通!非常感謝! – cspada

1

選擇類名稱是瀏覽器原生的,而元素中的數據選擇取決於jQuery中的循環。

使用類名來標記你的行和列,你的選擇器會更快。

+0

謝謝我會嘗試一下!我一直認爲班級名稱是最慢的。很高興知道! – cspada

+0

這取決於瀏覽器,通過數據屬性選擇是使用queryselectorall完成的。 –

+1

我使用arr [0] .children('[data-column = 1] [data-row = 3]');我認爲這對於使用類OR數據屬性無關緊要的效率是足夠的 – cspada