Jquery window.scroll函数冻结firefox

Jquery window.scroll函数冻结firefox,jquery,firefox,scroll,freeze,Jquery,Firefox,Scroll,Freeze,我正在处理一个带有固定菜单的页面,当用户从顶部滚动一定距离后,菜单会自动启动,当他们向下滚动页面时,菜单中的不同链接会被赋予一个更改颜色的类。所有这些在Chrome和Safari中似乎都很好,但在Firefox中,页面冻结在顶部。我想知道它是否在不停地循环某些代码…本质上冻结了窗口 这是我的密码 $.localScroll({ onBefore:function(){ $('body').data('scroll-executing',true); }, onAfter:function(){

我正在处理一个带有固定菜单的页面,当用户从顶部滚动一定距离后,菜单会自动启动,当他们向下滚动页面时,菜单中的不同链接会被赋予一个更改颜色的类。所有这些在Chrome和Safari中似乎都很好,但在Firefox中,页面冻结在顶部。我想知道它是否在不停地循环某些代码…本质上冻结了窗口

这是我的密码

$.localScroll({
onBefore:function(){
$('body').data('scroll-executing',true);
},
onAfter:function(){
$('body').data('scroll-executing',false);
$(窗口).trigger(“滚动”);
}
});
$(窗口)。滚动(函数(){
if($(this).scrollTop()>259){
$('.nav').addClass(“f-nav”);
}否则{
$('.nav').removeClass(“f-nav”);
}
});
$(窗口)。滚动(函数(){
if($('body').data('scroll-executing')){
返回;
}
//找到类为“active”的a并将其删除
$(“a”).removeClass(“活动”);
//获取窗口已滚动的数量
var scroll=$(窗口).scrollTop();
//根据滚动量将“活动”类添加到正确的导航
如果(滚动>2150){
$(“#nav_3”).removeClass('active');
$(“#nav_5”).attr('class','active');
setHash(“联系人”);
}否则如果(滚动>1300){
$(“#nav_2”).removeClass('active');
$(“#nav_3”).attr('class','active');
setHash(“投资组合”);
}否则如果(滚动>400){
$(“#nav_2”).attr('class','active');
setHash(“关于”);

否则如果(滚动在滚动事件上执行太多代码是多余的),在每个滚动条上,浏览器触发滚动事件百次,你可以考虑使用一个库,该库的方法有如<代码>节流< <代码>或<代码> DeBung >

将处理程序附加到窗口滚动事件是一个非常非常糟糕的主意。根据浏览器的不同,滚动事件可能会触发很多事件,将代码放入滚动回调将减慢任何滚动页面的尝试(不是一个好主意)。滚动处理程序中的任何性能下降因此,只会提高滚动的整体性能。相反,最好使用某种形式的计时器,每X毫秒检查一次,或者附加一个滚动事件,并且只在延迟后(或者甚至在给定的执行次数之后,然后是延迟)运行代码。


基本上,你在scroll事件中执行的太多了。正如@undefined所说,浏览器调用的次数比你想象的要多。一些提示:

当在一个将被多次调用的函数中时,请让您的jQuery对象已经创建。这样,每次调用该函数时,它都不会重新创建同一个jQuery对象

var nav2 = $("#nav_2");
$(window).scroll(function() {
   ...
   nav2.removeClass('active');
   ...
});
类似地,反复调用时,添加和删除类可能会消耗大量的处理周期,尤其是在访问整个元素类时,如在
$('.nav').addClass(“f-nav”);

相反,仅当类不存在时才尝试添加/删除这些类。例如:

var alreadyAdded = false;
var alreadyRemoved = false;
$(window).scroll(function () {
    if ($(this).scrollTop() > 259) {
      if(!alreadyAdded){
        $('.nav').addClass("f-nav");
        alreadyAdded = true;
        alreadyRemoved = false;
      }
    } else if(!alreadyRemoved) {
        $('.nav').removeClass("f-nav");
        alreadyAdded = false;
        alreadyRemoved = true;
    }
});

尽管如此,如果所有这些代码都附加到scroll事件中,它可能仍然会缓慢滚动。也许有另一种方法可以获得相同的效果。如果firefox处于冻结状态,我只能想象IE中的滚动速度会有多慢。

除了其他问题,
$('body')。scrollTop()
在Firefox中总是返回0。当
setHash()运行
$('html,body').scrollTop(scrollmem);}
时,它将跳转到屏幕顶部,看起来就像用户第一次加载页面时被卡在屏幕顶部一样。
$(window.scrollTop()
,结合节流,将解决这个问题。

你能给出一个显示问题的示例页面的链接吗,也许是在jsfiddle.net或类似的东西中?间隔是个好主意。另外,setHash选择的是主体而不是窗口,这也导致了一些问题。现在我已经让它工作了。它是ti我需要清理一些东西并开始缓存变量。谢谢你的帮助。
var alreadyAdded = false;
var alreadyRemoved = false;
$(window).scroll(function () {
    if ($(this).scrollTop() > 259) {
      if(!alreadyAdded){
        $('.nav').addClass("f-nav");
        alreadyAdded = true;
        alreadyRemoved = false;
      }
    } else if(!alreadyRemoved) {
        $('.nav').removeClass("f-nav");
        alreadyAdded = false;
        alreadyRemoved = true;
    }
});