[更新答案]
有两种方法可以解决这个问题。
1) 仅在 mousenter 事件上绑定您的 mousemove 事件,以便所有后续事件都以相同的顺序正确触发。 这涉及到很多绑定和解除绑定。
$(document).ready(function(){
var outer_mousemove = function(){ console.log('mousemove') };
$("#outer").hover(function(){
console.log('mouseenter');
// Attach the event listener only after
// Mouse enter has fired
$(this).mousemove( outer_mousemove );
}, function(){
$(this).unbind('mousemove', outer_mousemove );
});
});
2) 存储一个变量,只有在条件匹配时才执行mousemove事件。这种方式绑定/解除绑定要少得多(如果这是我的项目,我会这样做):
$(document).ready(function(){
var outer_mousemove = false;
$("#outer").hover(function(){
console.log('mouseenter');
outer_mousemove = true;
}, function(){
console.log('mouseleave');
outer_mousemove = false;
}).mousemove(function(){
if( outer_mousemove ){
console.log('mousemove');
}
});
});
[原答案]
mouseenter 是 jQuery 创建的一个特殊事件,这就是为什么它可能会在mousemove 之后触发。你可能想要的是mouseover:
$(document).ready(function(){
$('#outer').mouseover(function(){
console.log("mouse over");
}).mousemove(function(){
console.log("mouse move");
});
});
此外,为了避免从子元素接收多个鼠标悬停事件,您可以进行测试以确保您只对对象生成的事件进行操作:
$(document).ready(function(){
$('#outer').mouseover(function(e){
if(e.target == this){
console.log("mouse over");
}
}).mousemove(function(){
console.log("mouse move");
});
});
最后,在我的回答中,我使用了链接(即'mouseover().mousemove()')而不是调用选择器$("#outer") 两次。这只会让你的页面更快一点:)