在重新评估 if else 语句的条件后,如何停止调用 JQuery 函数?
How do I stop a JQuery function from being called after conditions for an if else statement are reevaluated?
我正在尝试为我的网站创建移动布局,但我在使用菜单部分时遇到了问题。我的所有 CSS 都有效,我已将问题缩小到我的 JQuery,具体来说:
var mobileNav = function(){
if($(window).width() < 751){
$('#mobile_nav').hide();
toggleNav();
} else {
$('#mobile_nav').show();
}
};
var toggleNav = function(){
$('#page_nav_bar').toggle(function(){
$('#mobile_nav').show();
}, function(){
$('#mobile_nav').hide();
});
};
mobileNav();
$(window).resize(mobileNav);
出于某种原因,当我将浏览器的尺寸从 751 以下调整为更大尺寸时,toggleNav() 函数不会停止。即使我的浏览器在调整大小后大于 751,当我尝试单击 #page_nav_bar 元素时,它也会切换 show/hide。其他功能(浏览器小时隐藏元素,大时显示)工作正常,但我不知道如何在 stop =27=] 比最初调用时大。
如果这是一个简单的修复,我很抱歉。我是 JQuery 的新手,几天来我一直在努力解决这个问题。我已经尽我所能尝试了 .on/.off,在 else 之后切换 .noop,并尝试重新排列所有内容(最初它是 mobileNav 变量下的所有代码块)。
感谢任何帮助。提前致谢!
这可能是由于竞争,每次 window 调度调整大小事件时您都会调用该函数(这意味着在调整大小时会花费很多时间)。然后 toggleNav(); at line4 也每次都执行。有时 DOM 没有刷新它的状态, window 调整大小回调函数再次被调用并导致您描述的问题,为了避免这个问题,我建议您执行以下操作:
resizeTimeout = null; //timeOut Timer Reference
$(document).ready(function(){ //called when Dom is ready (start up function)
$(window).resize(function(){
if(!resizeTimeout) //if there is no timeOut initialized
resizeTimeout = setTimeout(function(){ //execute this anomymous function avec 100 milliseconds
mobileNav();
resizeTimeout = null;
},100);
})
mobileNav();
});
我在window.resize的回调函数中使用setTimeout是因为以下原因:
- 避免在每次调整大小回调时调用 ToogleNav 函数(小优化)
- 确保在 DOM 刷新其状态后执行
您可以使用 css 轻松解决此问题:
#mobile_nav,
#mobile_nav.hidden{ display: none; } /* Hidden by default (mobile first) */
#mobile_nav.visible{ display: block } /* Visible by default only when using class="visible" */
@media (min-width: 751px ) {
#mobile_nav { display:block; } /* Visible by default only when the width is >= 751px */
#mobile_nav.hidden{ display: none; }
#mobile_nav.visible{ display: block } class="visible" */
}
很抱歉,我花了这么长时间才发现,但没有抛出任何错误,所以我没有多想,但 .toggle()
的函数签名实际上是
.toggle( [duration ] [, complete ] )
但是,您使用它更像是 hover 传递两个函数:
$('#page_nav_bar').toggle(function(){
$('#mobile_nav').show();
}, function(){
$('#mobile_nav').hide();
});
由于实际上 没有动画发生并且问题中没有提到它,我假设您不关心缓慢淡入淡出ins/outs。如果是这种情况,您可以像下面这样简化您的代码:
// NOTE: Try to only create jQuery objects once and reuse them
$window = $(window);
$mobile_nav = $("#mobile_nav");
var mobileNav = function() {
if ($window.width() < 751) {
$mobile_nav.hide();
} else {
$mobile_nav.show();
}
};
mobileNav();
$(window).resize(mobileNav);
我希望这就是您要找的。
演示: JSbin
我正在尝试为我的网站创建移动布局,但我在使用菜单部分时遇到了问题。我的所有 CSS 都有效,我已将问题缩小到我的 JQuery,具体来说:
var mobileNav = function(){
if($(window).width() < 751){
$('#mobile_nav').hide();
toggleNav();
} else {
$('#mobile_nav').show();
}
};
var toggleNav = function(){
$('#page_nav_bar').toggle(function(){
$('#mobile_nav').show();
}, function(){
$('#mobile_nav').hide();
});
};
mobileNav();
$(window).resize(mobileNav);
出于某种原因,当我将浏览器的尺寸从 751 以下调整为更大尺寸时,toggleNav() 函数不会停止。即使我的浏览器在调整大小后大于 751,当我尝试单击 #page_nav_bar 元素时,它也会切换 show/hide。其他功能(浏览器小时隐藏元素,大时显示)工作正常,但我不知道如何在 stop =27=] 比最初调用时大。
如果这是一个简单的修复,我很抱歉。我是 JQuery 的新手,几天来我一直在努力解决这个问题。我已经尽我所能尝试了 .on/.off,在 else 之后切换 .noop,并尝试重新排列所有内容(最初它是 mobileNav 变量下的所有代码块)。
感谢任何帮助。提前致谢!
这可能是由于竞争,每次 window 调度调整大小事件时您都会调用该函数(这意味着在调整大小时会花费很多时间)。然后 toggleNav(); at line4 也每次都执行。有时 DOM 没有刷新它的状态, window 调整大小回调函数再次被调用并导致您描述的问题,为了避免这个问题,我建议您执行以下操作:
resizeTimeout = null; //timeOut Timer Reference
$(document).ready(function(){ //called when Dom is ready (start up function)
$(window).resize(function(){
if(!resizeTimeout) //if there is no timeOut initialized
resizeTimeout = setTimeout(function(){ //execute this anomymous function avec 100 milliseconds
mobileNav();
resizeTimeout = null;
},100);
})
mobileNav();
});
我在window.resize的回调函数中使用setTimeout是因为以下原因:
- 避免在每次调整大小回调时调用 ToogleNav 函数(小优化)
- 确保在 DOM 刷新其状态后执行
您可以使用 css 轻松解决此问题:
#mobile_nav,
#mobile_nav.hidden{ display: none; } /* Hidden by default (mobile first) */
#mobile_nav.visible{ display: block } /* Visible by default only when using class="visible" */
@media (min-width: 751px ) {
#mobile_nav { display:block; } /* Visible by default only when the width is >= 751px */
#mobile_nav.hidden{ display: none; }
#mobile_nav.visible{ display: block } class="visible" */
}
很抱歉,我花了这么长时间才发现,但没有抛出任何错误,所以我没有多想,但 .toggle()
的函数签名实际上是
.toggle( [duration ] [, complete ] )
但是,您使用它更像是 hover 传递两个函数:
$('#page_nav_bar').toggle(function(){
$('#mobile_nav').show();
}, function(){
$('#mobile_nav').hide();
});
由于实际上 没有动画发生并且问题中没有提到它,我假设您不关心缓慢淡入淡出ins/outs。如果是这种情况,您可以像下面这样简化您的代码:
// NOTE: Try to only create jQuery objects once and reuse them
$window = $(window);
$mobile_nav = $("#mobile_nav");
var mobileNav = function() {
if ($window.width() < 751) {
$mobile_nav.hide();
} else {
$mobile_nav.show();
}
};
mobileNav();
$(window).resize(mobileNav);
我希望这就是您要找的。
演示: JSbin