jquery
  • live
  • 2010-02-06 84 views 0 likes 
    0
    <input type="text" id="sShState" /> 
    $('#sShState').liveSearch(); // A plug-in 
    // inside plug-in: 
    $this = $(this); 
    
    // On focus I add a dropdown box and add li's; 
    
    var obj = '<ul id="ddList"></ul>'; 
    $this.after(obj); 
    $this.next('ul').html(li's); 
    
    $('#ddList').live('mouseenter', function(){ 
        var $li = $this.next('ul').children('li'); 
        $li.removeClass('hoverLi'); 
        $li.hover(function(e){ 
         $li.filter('[last]').removeAttr('last'); 
         $(this).addClass('hoverLi'); 
        },function() { 
         $li.filter('.hoverLi').attr('last', true); 
         $li.filter('.hoverLi').removeClass('hoverLi'); 
        }); 
    
        $li.click(function(){ 
         selectLi($(this)); 
         removeList(); 
        }); 
    }); 
    

    在Chrome中它非常非常快!爲什麼Firefox中的代碼變慢?

    但是在Firefox中,當鼠標第一次進入ulbox時,它需要1-2秒直到它開始執行代碼。

    即使在Internet Explorer 7中也能正常工作。懸停的li仍然有點落後,但是當鼠標進入ul盒子時立即開始執行。

    回答

    2

    您似乎在另一個事件中有事件分配代碼。所以無論何時發生'mouseenter'事件,它都會重新分配'懸停'和'點擊'事件。你應該在live()函數之外附加一次這些事件。

    我不知道你的頁面結構,所以這可能不完全正確。但它確實說明了這個問題。

    $('#ddList').live('mouseenter', function(){ 
        var $li = $this.next('ul').children('li'); 
        $li.removeClass('hoverLi');   
    }); 
    
    $('#ddList li').hover(function(e){ 
         // $(this).filter('[last]').removeAttr('last'); 
         $(this).addClass('hoverLi'); 
    },function() { 
         // $(this).filter('.hoverLi').attr('last', true); 
         $(this).filter('.hoverLi').removeClass('hoverLi'); 
    }); 
    
    $('#ddList li').click(function(){ 
         selectLi($(this)); removeList();  
    }); 
    

    我不能完全肯定發生了什麼事情在你的代碼,但如果你的目的是,確保事件得到重視動態創建的「禮」的元素,那麼你就需要使用.live()就像你爲'mouseenter'做的那樣。

    $('#ddList li').live('mouseover', function() {... 
    
    $('#ddList li').live('mouseout', function() {... 
    
    $('#ddList li').live('click', function() {... 
    

    編輯:點擊()VS活()

    如果我在HTML中具有<div id='mydiv'></div>,解釋那麼我需要做的是指定以下附加一個單擊事件:

    $('#mydiv').click(function() { 
        // whatever I want to do on click 
    }); 
    

    但是,如果div被動態添加到DOM,那麼我可以使用live()來代替,並且每當我動態添加元素時,jQuery都會自動分配一個事件。

    $('#mydiv').live('click', function() { 
        // whatever I want to do on click 
        // jQuery takes care of assigning it to mydiv when dynamically added to DOM 
    }); 
    
    +0

    但爲什麼它在Chrome甚至IE7中速度如此之快,FF如此之慢? – silversky 2010-02-06 20:22:23

    +0

    好問題。我不知道。也許綁定事件元素在FF中簡單得慢。鉻有一個邪惡的快速JavaScript引擎,所以這有幫助。最終,你想正確地形成你的代碼。重複綁定多餘的事件是不行的。修復它並查看它在FF中的工作原理。 – user113716 2010-02-06 20:27:06

    +0

    li是動態創建的,所以我不能遍歷dom並使用live()。我不認爲我可以使用$('#ddList li')。live()。我記得在文檔中它說我們應該在選擇obj()後立即使用它,它不支持DOM遍歷。我理解對嗎? – silversky 2010-02-06 20:38:50

    相關問題