Jquery 与 setTimeout 的效果
好吧,我确信我在这里遗漏了一些基本的东西!但我一生都无法解决这个问题。
场景
这是一个简单的隐藏显示菜单;
// Setup hover
var fadeDuration = 200;
var setDelay;
$level1Item.hover(function () {
$(this).addClass('hover').find('.level-2').fadeIn(fadeDuration);
}, function () {
$(this).removeClass('hover').find('.level-2').fadeOut(fadeDuration);
});
它工作得很好……但是下拉菜单相当大,当你的鼠标从屏幕顶部移动到底部时它弹出时会很烦人,而且它非常性感。
所以我想设置一个超时并在鼠标移出时清除它......
// Setup hover
var fadeDuration = 200;
var setDelay;
$level1Item.hover(function () {
setDelay = setTimeout("$(this).addClass('hover').find('.level-2').fadeIn(200)", 500);
//$(this).addClass('hover').find('.level-2').fadeIn(fadeDuration);
}, function () {
clearTimeout(setDelay);
$(this).removeClass('hover').find('.level-2').fadeOut(fadeDuration);
});
绝对没有发生任何事情!我已经尝试过超时函数中的警报,它们起作用了...最初变量 fadeDuration 未定义,但一个数字停止了控制台错误。
OK, I am missing something fundamental here I am sure! But for the life of me can not work it out.
Scenario
It's a simple hide show menu;
// Setup hover
var fadeDuration = 200;
var setDelay;
$level1Item.hover(function () {
$(this).addClass('hover').find('.level-2').fadeIn(fadeDuration);
}, function () {
$(this).removeClass('hover').find('.level-2').fadeOut(fadeDuration);
});
And it works fine... but the drop down is rather LARGE and is irritating when it pops up all be it very sexily when you mouse moves from top to bottom of screen.
So I want to set a timeout and clear it on mouse out...
// Setup hover
var fadeDuration = 200;
var setDelay;
$level1Item.hover(function () {
setDelay = setTimeout("$(this).addClass('hover').find('.level-2').fadeIn(200)", 500);
//$(this).addClass('hover').find('.level-2').fadeIn(fadeDuration);
}, function () {
clearTimeout(setDelay);
$(this).removeClass('hover').find('.level-2').fadeOut(fadeDuration);
});
ABSOLUTELY NOTHING HAPPENS!! I have tried alerts in the timeout function and they work... originally the variable fadeDuration was undefined but a number stops the console error.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
尝试修改
setTimeout
调用以使用匿名函数:Try amending the
setTimeout
call to use an anonymous function:当您传递给
setTimeout
的字符串被eval()
ed 时,this
是window
而不是您的任何对象期待。不要将字符串传递给
setTimeout
,并小心保留this
的值。When the string you pass to
setTimeout
iseval()
ed,this
iswindow
and not whatever object you are expecting.Don't pass strings to
setTimeout
, and be careful to preserve the value ofthis
.您不能在
setTimeout
代码中使用this
,因为this
取决于上下文。因此,当超时触发时,this
是一个不同的this
...英语不好,但希望它有意义。另外,避免在计时器中使用字符串;使用函数代替。虽然您可以使用字符串,然后将其计算为 JavaScript,但与简单地将相同代码包装在函数中相比,它通常是不好的形式
You can't use
this
in thesetTimeout
-code, sincethis
depends on the context. So when the timeout fires, thethis
is a differentthis
... bad English, but hopefully it makes sense.Also, avoid using strings in timers; use functions instead. While you can use a string, which is then evaluated as JavaScript, it's generally bad form compared to simply wrapping the same code in a function