如何分别监听x和y滚动事件的滚动事件

时间:2018-11-12 09:13:34

标签: javascript typescript javascript-events rxjs6

我想监听滚动事件并通过两个滚动两个函数处理它们。

一个需要节流时间()来节省资源,而另一个不能使用节流时间(),因为它需要立即触发并且不会进行过多投射。

现在,我添加了两个fromEvent来处理它们,但问题是,如果滚动事件被触发,它们都会被触发。

fromEvent(this.vscroll.nativeElement, 'scroll').pipe(throttleTime(200)).subscribe((e) => {
  if (this.timer) {
    clearTimeout(this.timer);
    this.timer = null;
    this.timer = setTimeout(() => {
      this.updateShow();
    }, 201);
  } else {
    this.timer = setTimeout(() => {
      this.updateShow();
    }, 201);
  }
});
fromEvent(this.vscroll.nativeElement, 'scroll').subscribe((e) => {
  (document.body.querySelector('#headerScroll') as HTMLElement).style.marginLeft = -this.vscroll.nativeElement.scrollLeft + 'px';
});

在我的组件中,这两个功能不会同时发生,因此我应该怎么做才能使其仅触发一个功能并阻止另一个功能被执行。

1 个答案:

答案 0 :(得分:0)

创建您的单个函数,但存储先前的X和Y滚动位置,以便查看它们在两次调用之间是否已更改:

var scrollY = 0;
var scrollX = 0;
function onScroll(){
  var doc = document.documentElement;
  if(doc.scrollLeft !== scrollX) {
    scrollX = doc.scrollLeft;
    //Put behaviour for X scroll here
    $("p").text("X SCROLLED!");
  }
  if(doc.scrollTop !== scrollY) {
    scrollY = doc.scrollTop;
    //Put behaviour for Y scroll here
    $("p").text("Y SCROLLED!");
  }
}

window.addEventListener('scroll', onScroll);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div style="width:1000px; height:1000px; background-color:rebeccapurple; color:#FFF">
  <p style="position: fixed;"></p>
</div>