<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框时它会立即开始执行。
答案 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
});