检查用户是不是在 Angular 2 中滚动到底部

Posted

技术标签:

【中文标题】检查用户是不是在 Angular 2 中滚动到底部【英文标题】:Check if user has scrolled to the bottom in Angular 2检查用户是否在 Angular 2 中滚动到底部 【发布时间】:2016-11-10 02:39:13 【问题描述】:

在没有 jQuery 的情况下,检查用户是否在 Angular2 中滚动到页面底部的最佳做法是什么?我可以访问我的应用程序组件中的窗口吗?如果不是,我应该检查是否滚动到页脚组件的底部,我该怎么做?页脚组件的指令?有人做到了吗?

【问题讨论】:

这个在 Angular 6 中工作 --> ***.com/a/42547136/621951 【参考方案1】:

//你可以用这个。

@HostListener("window:scroll", [])
onScroll(): void 
if ((window.innerHeight + window.scrollY) >= document.body.offsetHeight) 
        // you're at the bottom of the page
    

【讨论】:

必须将其写为 @HostListener("window:scroll", []) 才能使其工作。 "document.body.offsetHeight - 1" 可能会更好。 对我来说这有效 - (window.innerHeight + window.scrollY) >= document.body.scrollHeight 这可行,但就像底部上方的一些像素一样。我们如何检测用户是否已经滚动到最后?【参考方案2】:

对我来说,聊天框的底部不在页面底部,因此我无法使用 window.innerHeight 查看用户是否滚动到聊天框的底部。 (我的目标是始终滚动到聊天的底部,除非用户试图向上滚动)

我改用了以下方法,效果很好:

let atBottom = element.scrollHeight - element.scrollTop === element.clientHeight

一些上下文:

@ViewChild('scrollMe') private myScrollContainer: ElementRef;
disableScrollDown = false

 ngAfterViewChecked() 
    this.scrollToBottom();


private onScroll() 
    let element = this.myScrollContainer.nativeElement
    let atBottom = element.scrollHeight - element.scrollTop === element.clientHeight
    if (this.disableScrollDown && atBottom) 
        this.disableScrollDown = false
     else 
        this.disableScrollDown = true
    



private scrollToBottom(): void 
    if (this.disableScrollDown) 
        return
    
    try 
        this.myScrollContainer.nativeElement.scrollTop = this.myScrollContainer.nativeElement.scrollHeight;
     catch(err)  

<div class="messages-box" #scrollMe (scroll)="onScroll()">
    <app-message [message]="message" *ngFor="let message of messages.slice().reverse()"></app-message>
 </div>

【讨论】:

【参考方案3】:

而不是使用 document.body.offsetHeight 使用这个:

if ((window.innerHeight + window.scrollY) >= document.body.scrollHeight) // you're at the bottom of the page

【讨论】:

scrollHeight 值与 offsetHeight 有何不同?【参考方案4】:

使用 @HostListener 装饰器监听 window:scroll 事件。

@HostListener('window:scroll', [])
onScroll(): void 
  const triggerAt: number = 128; 
  /* perform an event when the user has scrolled over the point of 128px from the bottom */
  if (document.body.scrollHeight - (window.innerHeight + window.scrollY) <= triggerAt) 
    doSomething();
  

使用scrollHeight 而不是offsetHeightclientHeight 如果内容将事件挂钩到可滚动。

【讨论】:

以上是关于检查用户是不是在 Angular 2 中滚动到底部的主要内容,如果未能解决你的问题,请参考以下文章

如何确定 div 是不是滚动到底部?

滚动到底部; scrollTop = scrollHeight 运行太早?

除非用户向上滚动,否则保持溢出 div 滚动到底部

Ionic 4 离子含量滚动到底部

更改路线不会在新页面中滚动到顶部

当外部div的大小发生变化时,可滚动的div可以坚持到底部