簡體   English   中英

在IE6中,Jquery工作得非常慢

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM