为什么Firefox中的代码速度较慢?

时间:2010-02-06 20:07:05

标签: jquery live

<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中,当鼠标第一次进入ulbox时,需要1-2秒才能开始执行代码。

即使在Internet Explorer 7中也能正常工作。悬停的li仍然稍微落后,但是当鼠标进入ul框时它会立即开始执行。

1 个答案:

答案 0 :(得分: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 ();      
});

我不完全确定您的代码中发生了什么,但如果您的目的是确保事件附加到动态创建的“li”元素,那么您需要像使用的那样使用.live() '的mouseenter'。

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

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

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

编辑:click()vs live()

的说明

如果我在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
});