鼠标输入鼠标离开没有按照我认为应该的方式工作
mouseenter mouseleave not working the way I think it should
我对jQuery相对较新,我似乎遇到了这个mouseenter/mouseleave问题。我想设置一个菜单,当页面不在顶部时"隐藏",这似乎工作正常,当它被隐藏时,我想让它成为当用户将鼠标悬停在它上面时,类切换并且菜单回来。但是,当它滚动回顶部时,我不希望这样。当页面首次加载(在 Firefox 和 chrome 中)并且我还没有滚动时,它工作正常,但是向下滚动并返回顶部后,菜单将在鼠标离开时隐藏。
这是我当前代码设置的jsFiddle。
我已经尝试解决这个问题一段时间了,并尝试了其他一些方法。
我试过像这样使用悬停
$("#access").hover(function() {
$(this).removeClass("scroll").addClass("normal");
}, function() {
$(this).removeClass("normal").addClass("scroll");
});
但这与我现在拥有的代码相同。
我尝试的其他一些方法是将 b 变量传递给另一个函数,创建一个单独的div 并跟踪它的位置以确定是否使用 mouseenter/mouseleave,最后绑定它们,但这些似乎都没有像我认为的那样工作。
我想不出还有什么可以尝试的,所以我不确定这是否是我做错了什么,或者这甚至不可能像这样完成。
这是我的第一个问题,我试图包含尽可能多的信息,希望这是足够的信息。
试试这个
$(document).ready(function() {
$(window).scroll(function() {
var b = $(window).scrollTop();
$("#access").toggleClass("normal", b == 0)
$("#access").toggleClass("scroll", b > 0)
});
$("#access").hover(function() {
if($(window).scrollTop() > 0){
$("#access").toggleClass("normal scroll");
}
});
});
http://jsfiddle.net/bJquD/6/
您没有考虑页面的滚动状态,因此无论页面是否滚动,mouseenter/mouseleave 事件都会重置类名而不考虑。可以预见的是,这与你想要的并不相符。
对此的明显解决方案是使用全局变量(尽管在 jQuery 文档就绪的范围内)来跟踪这一点,然后在 hover()
函数中检查它,导致以下内容:
var scrolled = false;
$(window).scroll(
function(){
var b = $(window).scrollTop();
if (b == 0) {
$('#access').removeClass('scroll').addClass('normal');
scrolled = false;
}
else if (b > 0) {
$('#access').removeClass('normal').addClass('scroll');
scrolled = true;
}
});
$('#access').hover(
function(){
if (scrolled) {
// window scrolled, hence access class should be 'scroll'
$('#access').removeClass('scroll').addClass('normal');
}
},
function(){
if (scrolled) {
// window scrolled, hence access class should be 'normal' (from mouseenter)
$('#access').removeClass('normal').addClass('scroll');
}
});
JS小提琴演示。
这样做的结果是,如果页面未滚动,则mouseenter
/mouseleave
事件不执行任何操作(因为它们不应该,在这种情况下,normal
类名是正确的),而如果页面滚动,它们会在mouseenter
上删除滚动类名并在mouseleave
上恢复它。
是的,您正在向该元素添加一堆事件处理程序,这最终会令人难以置信地减慢页面速度。你想避免这样做。或者,您可以绑定事件,然后在滚动到页面顶部时将其删除。最好的方法是使用下面的代码。
$(document).ready(function() {
$(window).scroll(function() {
if ($(this).scrollTop() > 0) {
$("#access").removeClass("normal").addClass("scroll").on('mouseenter', function() {
$(this).removeClass("scroll").addClass("normal");
}).on('mouseleave', function() {
$(this).removeClass("normal").addClass("scroll");
});
} else {
$("#access").removeClass("scroll").addClass("normal").off('mouseenter mouseleave');
}
});
});
您也可以在这里尝试一下。
希望这对您有所帮助:)
在这里,您只需添加变量isOnTop,mouseenter和mouseleave处理程序在执行任何操作之前都会对其进行检查。
$(document).ready(function() {
var isOnTop=1;
$(window).scroll(function() {
var b = $(window).scrollTop();
if (b > 0) {
isOnTop=0;
$("#access").removeClass("normal").addClass("scroll");
}
else if (b == 0) {
isOnTop=1;
$("#access").removeClass("scroll").addClass("normal");
}
});
$("#access").mouseenter(function() {
if(isOnTop){return;}
$(this).removeClass("scroll").addClass("normal");
});
$("#access").mouseleave(function() {
if(isOnTop){return;}
$(this).removeClass("normal").addClass("scroll");
});
});
- iOS鼠标中心绑定只工作一次
- jquery鼠标选择无法正常工作
- 当我用鼠标左键点击时,让这个功能工作起来
- 鼠标输入鼠标离开没有按照我认为应该的方式工作
- 如何使用jQuery或JavaScript使鼠标滚轮不工作
- Kinectjs在画布上鼠标向下位置的准确性和clearRect未按预期工作
- 地图,rails 4.2,javascript,鼠标悬停,只工作一次(或两次).然后在重新加载之后
- 如何在ExtJS中构建无需鼠标即可工作的应用程序
- 按钮按下的鼠标按下事件侦听器不工作
- 如何使鼠标中键在 JavaScript 中使用 preventDefault() 正常工作
- 为什么鼠标滚轮在Chrome中工作,而在Firefox中不起作用
- 鼠标悬停在整个页面上工作,而不是一个元素
- 无法将鼠标悬停在 xCharts 中工作
- 鼠标悬停时显示图像(在带有 jsfiddle 的工作示例中)
- D3JS 强制引导,鼠标悬停在线链接无法正常工作
- 为什么此鼠标悬停脚本无法正常工作
- Javascript鼠标抖动游戏无法正常工作
- 穆森特和鼠标效果无法正常工作
- 鼠标无法在Android网页上工作
- 鼠标悬停不工作