微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

javascript – 使“scrollLeft”/“scrollTop”更改不会触发滚动事件侦听器

目前我的程序位于一个地方,它既可以监听用户滚动某个元素,也可以自动滚动这个元素. (不是一个渐进的,漂亮的卷轴,而是瞬间跳跃.我发誓在上下文中有道理.)

如果通过设置scrollLeft或scrollTop完成滚动,有没有办法使滚动事件不触发?我的第一个想法是一个基本的开关,如:

ignoreScrollEvents = true;
element.scrollLeft = x;
ignoreScrollEvents = false;

function onScroll() {
  if(ignoreScrollEvents) return false;
}

但由于事件不会立即触发(oops,duhh),这不是一个可行的解决方案.我可以尝试其他什么样的答案?我也在使用jQuery,如果这有帮助的话.

解决方法:

最简单的通用方法?只需在事件处理程序中重置标志即可.如果您实际上正在更改值,您将首先检查,否则将不会触发事件 – 因为Rodrigo notes,这里的一个好习惯是将其分解为所谓的“setter”函数

function setScrollLeft(x)
{
  if ( element.scrollLeft != x )
  {
    ignoreScrollEvents = true;
    element.scrollLeft = x;
  }
} 

...

function onScroll() 
{
  var ignore = ignoreScrollEvents;
  ignoreScrollEvents = false;

  if (ignore) return false;

  ...
}

但是,根据您的需要,您可能已经将滚动位置存储在某处;如果是这样,只需更新并检查它作为您的标志.就像是:

element.scrollLeft = currentScrollLeft = x;

...

function onScroll() 
{
  // retrieve element, etc... 

  if (element.scrollLeft == currentScrollLeft) return false;

  ...
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐