[英]Jquery working very slow in IE6
我在我的應用程序中使用以下jquery代碼..
我們的想法是當用戶來到表單並單擊屏幕上的任何按鈕時單擊按鈕。
<script>
$(document).ready(function() {
$('form').focusin(function() {
$(this).addClass('focused');
});
$(':not(form)').bind('click', function(e) {
if (!$(e.target).parents('form.focused').length) {
form.getElementById("customerdetails").click();
}
});
});
</script>
這個腳本在forefox中運行正常,但這在IE6中非常慢......我可能知道這個的原因嗎? 它在IE8中運行得更快......任何想法?
請建議在IE6中改進這一點
非常感謝,傑克。
$(':not(form)').bind()
哎喲! 您剛剛選擇了頁面上除表單之外的每個元素,並分別在每個元素上添加了一個click
處理程序。 這可能是整個元素的負載(甚至像<head>
和<script>
這樣的click
沒有意義)。
到目前為止,這確實會很慢:你只是在其他瀏覽器中看不到它,因為它們的JS引擎通常比IE6更快。
在父元素上使用委托來捕獲它下面的所有點擊,檢查每次單擊時的選擇器條件,而不是選擇所有元素並更改它們:
$(document).delegate('*', 'click', function(e) {
if (!$(e.target).is('form.focused *'))
$('#customerdetails').focus();
});
[編輯:移動選擇器測試; 雖然委托:not(form.focused *)
在jQuery中工作,但它有點頑皮,因為它不是標准的CSS3選擇器。 CSS3只允許使用“簡單選擇器” :not
。
編寫$(':not(form)').bind('click', ...)
將循環遍歷文檔中除<form>
標記之外的每個元素,並為每個元素添加單獨的單擊處理程序。
這可能非常慢。
相反,您應該向文檔添加click
處理程序,並檢查單擊是否源自<form>
標記,如下所示:
$(document).click(function(e) {
var $target = $(e.target);
if ($target.is('form.focused') || $target.closest('form.focused').length)
return;
form.getElementById("customerdetails").click();
});
您可能希望使用委托來附加一個處理程序,而不是將處理程序附加到所有非表單元素。 此處理程序捕獲所有單擊事件 ,並決定要執行的操作。 這將加快所有瀏覽器的速度 。
$(document).ready(function() {
$('form').focusin(function() {
$(this).addClass('focused');
});
$(document).delegate("form:not(.focused) *", "click", function(){
$('#customerdetails').focus();
});
});
IE6的javascript引擎和DOM操作有時候很慢。 為了一次修改大量元素,它可能非常耗費資源。 IE6也有阻止更新控件的趨勢,直到某些函數調用完成(這在動態更新選擇列表時最明顯,你經常需要使用setTimeout推遲執行)。 真的很煩人。
我在使用JQuery選擇器時給你的建議是,如果你沒有使用id選擇器,例如:
$("#myElement");
...總是嘗試使用標簽類型為任何選擇器添加前綴,這將加快選擇速度。 當您使用id選擇器時,jquery將使用瀏覽器本機getElementById函數。 當您提供標簽名稱時,例如:
$("div.myElement");
jquery將使用本機getElementsByTagName函數來獲得更快的列表。 這比遍歷整個DOM以嘗試查找匹配元素要快得多。
要進一步發展,請嘗試為選擇器提供一個上下文。 上下文基本上是開始搜索的起點。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.