【问题标题】:Window scroll event causing IE to lag badly, when using mouse wheel使用鼠标滚轮时导致 IE 严重滞后的窗口滚动事件
【发布时间】:2014-10-06 03:53:28
【问题描述】:

我在页面顶部附近有一个导航容器,当页面滚动超过某个值时,它应该添加或删除类名“stuck”(在 position:static 和 position:fixed 之间切换)。似乎在 FF 和 Chrome 中运行良好,但 IE(7,8 和 9)当然有问题。

当使用鼠标滚轮滚动时,页面会严重滞后(基本上无法使用),但如果我抓住并拖动水平滚动条,则页面会平滑滑动,没有滞后。

我的搜索显示这可能是因为 IE 执行的滚动事件比其他浏览器多,但我无法确切知道如何限制被触发的事件数量。您可以在下面的代码块中看到,我也在使用“滚动停止”解决方案,但我确实还需要能够在用户超出页面上某个点时仍在滚动时执行回调。

我认为我实现它的方式很漂亮,精简且基本,但有没有更好的方法来处理这个问题,至少仅适用于 IE?

var scrollValue = 0;
var scrollTimer = false;

$(window).bind('scroll', function(){
    scrollValue = $(window).scrollTop();

    // SET TIMER DELAY FOR SCROLL-STOP
    if (scrollTimer) {
        clearTimeout(scrollTimer);
    }
    scrollTimer = setTimeout(scrollStopped, 25);

    // STICK/UNSTICK HEADER
    if (scrollValue > 320){
        if (!$(stickyWrap).hasClass('stuck')){
            $(stickyWrap).addClass('stuck')
        }
    } else {
        if ($(stickyWrap).hasClass('stuck')){
            $(stickyWrap).removeClass('stuck');
        }
    }
});

【问题讨论】:

  • 与您的回答无关,但会触发事件$(window).on('scroll', function(){...}).trigger('scroll');,因为页面加载时并不总是为 0。
  • 我猜想 IE 会因为你执行 setTimelimit 的时间太短而滞后。您可以尝试将其增加到 100

标签: javascript jquery internet-explorer scroll


【解决方案1】:

关闭超时,向上切换

如果你让 jQuery 更简单一点,并添加一个开关,在阈值前后只执行一次,它应该会加快速度。

var header = $('.stickyWrap'),
    trig = 320,
    go = true;

$(window).bind('scroll', function(){
    var scrollValue = $(this).scrollTop();

    if ((go && scrollValue > trig) || (!go && scrollValue <= trig)) {//before or after
        header.toggleClass('stuck');//toggle class
        go ? go = false : go = true;//toggle boolean
    }
});

现在它只会在超过320的阈值之前和之后尝试执行一次。

Made A Fiddle >

【讨论】:

  • 我不知道。这个问题是几年前的问题,我什至不记得发生了什么或是否已解决。我敢肯定这在某种程度上与 IE 是最愚蠢的事情有关。
猜你喜欢
  • 1970-01-01
  • 2014-08-14
  • 2012-02-14
  • 2010-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多