如何处理 Angular 4 中的窗口滚动事件?

2023-11-30

我似乎无法捕获窗口滚动事件。 在几个网站上我发现了类似的代码:

@HostListener("window:scroll", [])
onWindowScroll() {
  console.log("Scrolling!");
}

这些片段通常来自版本 2。这在 Angular 4.2.2 中似乎不起作用(不再?)。例如,如果我将“window:scroll”替换为“window:touchmove”,那么 touchmove 事件就可以很好地处理。

有谁知道我错过了什么?非常感谢!


可能是你的document不是滚动,而是div里面是。滚动事件仅冒泡到window如果它是从调用的document。另外,如果您捕获事件document并调用类似的东西stopPropagation,您将不会收到该事件window.

如果您想捕获应用程序内的所有滚动事件(这些事件也来自微小的可滚动容器),则必须使用默认值addEventListener方法与useCapture set to true.

当它下降时,这将触发该事件DOM,而不是气泡阶段。不幸的是,坦率地说,这是一个很大的失误,Angular 没有提供传递事件侦听器选项的选项,因此您必须使用addEventListener:

export class WindowScrollDirective {

    ngOnInit() {
        window.addEventListener('scroll', this.scroll, true); //third parameter
    }

    ngOnDestroy() {
        window.removeEventListener('scroll', this.scroll, true);
    }

    scroll = (event): void => {
      //handle your scroll here
      //notice the 'odd' function assignment to a class field
      //this is used to be able to remove the event listener
    };

}

现在这还不是全部,因为所有主要浏览器(显然除了 IE 和 Edge)都已经实现了新的addEventListener规范,这使得可以将对象传递为第三个参数.

使用此对象,您可以将事件侦听器标记为passive。建议对触发大量时间的事件执行此操作,这可能会干扰 UI 性能,例如滚动事件。要实现此功能,您应该首先检查当前浏览器是否支持此功能。他们在 mozilla.org 上发布了一个方法passiveSupported,您可以通过它检查浏览器支持情况。不过,只有当您确定不打算使用时,您才能使用它event.preventDefault()

在我向您展示如何执行此操作之前,您可以想到另一个性能功能。为了防止运行更改检测(DoCheck每次区域内发生异步事件时都会被调用。就像事件触发一样,您应该在区域外运行事件侦听器,并且仅在确实需要时才进入它。 Soo,让我们把所有这些结合起来:

export class WindowScrollDirective {

    private eventOptions: boolean|{capture?: boolean, passive?: boolean};

    constructor(private ngZone: NgZone) {}

    ngOnInit() {            
        if (passiveSupported()) { //use the implementation on mozilla
            this.eventOptions = {
                capture: true,
                passive: true
            };
        } else {
            this.eventOptions = true;
        }
        this.ngZone.runOutsideAngular(() => {
            window.addEventListener('scroll', this.scroll, <any>this.eventOptions);
        });
    }

    ngOnDestroy() {
        window.removeEventListener('scroll', this.scroll, <any>this.eventOptions);
        //unfortunately the compiler doesn't know yet about this object, so cast to any
    }

    scroll = (): void => {
        if (somethingMajorHasHappenedTimeToTellAngular) {
           this.ngZone.run(() => {
               this.tellAngular();
           });
        }
    };   
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何处理 Angular 4 中的窗口滚动事件? 的相关文章

随机推荐

  • 在 C++ 中设置单独的位[重复]

    这个问题在这里已经有答案了 我有一个 5 字节数据元素 我需要一些帮助来弄清楚如何在 C 中设置这些字节之一的单个位 请参阅下面我的示例代码 char m TxBuf 4 我想将位 2 设置为字节的高位m TxBuf 1 00000 0 0
  • Android 中通过触摸事件进行反向地理编码

    我通过此堆栈溢出浏览了几篇文章以及其他与反向地理编码相关的文章 我打算从触摸事件中查找具有给定纬度和经度的地点的名称 我从触摸事件中获取了纬度和经度 但无法从该地理坐标中获取地址 它传递异常而不是在尝试区域中 这是代码 public boo
  • 在 Objective C 中检测 PNG 文件是否损坏

    我正在使用 NSURLRequest 下载 jpg 和 png 这工作正常 但有时文件会损坏 我见过捕获错误 损坏的 JPEG 数据 数据段过早结束并使其适用于 jpg 有谁知道对 png 做同样的事情的方法吗 即以编程方式检查 png 数
  • 使用 event.which 来验证用户是否按下空格键在 Firefox 中不起作用

    我想要一个脚本来验证按下的键是否是 空格键 键码 32 我注意到 IE 使用其他函数名称 我尝试了很多在这里找到的解决方案 event event window event IE does not pass event to the fun
  • 如何使用C#读取从asp.net页面传递的参数?

    我是 ASP net 新手 如何读取从 ASP net 页面传递的参数 任何小例子都会受到赞赏 这对我来说只是一个开始 使用您的示例 URL string id Request QueryString id string nam Reque
  • Spring Cloud Gateway转发客户端证书

    我正在尝试将 spring cloud gateway 用于基于 spring boot 的服务 该服务使用 ssl 和客户端身份验证 问题是 通过 api 网关从客户端调用服务总是失败 并显示 certificate unknown 没有
  • Phonegap 视频捕捉崩溃

    我制作了一个相对简单的phonegap应用程序 能够捕获图像和视频并将其上传到服务器 图像工作正常 但是当我调用捕获视频时 会出现相机 UI 当我接受视频时 应用程序崩溃并在 logcat 中出现以下错误 java lang Runtime
  • :touch CSS 伪类或类似的东西?

    我正在尝试制作一个按钮 这样当用户单击它时 它会在按住鼠标按钮的同时更改其样式 如果在移动浏览器中触摸它 我还希望它以类似的方式改变其样式 对我来说 看似显而易见的事情是使用 CSS active 伪类 但这不起作用 我尝试过 focus
  • R SHINY - 条件面板输出偏移?

    这篇文章是相关的R闪亮 复选框和条件面板问题 我在这里成功地创建了该问题的 MRE 再次总结一下 当单击第二个复选框或同时单击第一个和第二个复选框时 数据帧输出会发生移动 我希望它显示在与单击时相同的位置第一个复选框 library shi
  • 使用 Qt 中的命名参数列表发出 HTTP POST 请求

    我需要从 Qt 应用程序向服务器发出 HTTP POST 请求 POST 请求将包含命名值列表 即键 值对 它们主要是字母数字字符串 但可以包含特殊字符 例如引号 空格等 在 Qt 中执行此类 POST 请求的规范方法是什么 当前答案适用于
  • 将 Swift 数组转换为 NSData 以进行 NSUserDefaults.StandardUserDefaults 持久存储

    我正在尝试通过制作一个小应用程序来了解 Swift 在相对熟悉 Obj C 之后 我想使用 NSUserDefaults 持久保存少量数据 但我遇到了问题 我初始化一个空的元组数组 如下所示 var costCategoryArray na
  • 无法将 Ruby on Rails 连接到远程 mysql 数据库

    我正在尝试将我的rails 3应用程序连接到godaddy服务器上托管的mysql数据库 我可以使用 mysql 客户端进行远程连接 但在运行应用程序时却无法进行连接 我能够连接本地 mysql 但是当我尝试连接到远程托管数据库时 出现此错
  • 由于编码问题,WebClient.DownloadString 导致字符损坏,但浏览器正常

    下面的代码 var text new WebClient DownloadString http export arxiv org api query search query au Freidel L start 0 max result
  • Pandas - 当字符串与格式匹配时出现“时间数据与格式不匹配”​​错误?

    我收到一个值错误 指出我的数据与格式不匹配 不确定这是一个错误还是我在这里遗漏了一些东西 我指的是本文档对于字符串格式 奇怪的部分是 如果我将 数据 Dataframe 写入 csv 并读取它 然后调用下面的函数将转换日期 所以我不确定为什
  • php 邮件功能不发送电子邮件/发送电子邮件花费太长时间

    我有一个机架空间云 我想在其中设置 LAMP 服务器有CentOS 我安装了sendmail并且php邮件功能使用这个 但是使用php邮件功能发送电子邮件需要很长时间
  • Spark SQL - 转义查询字符串

    我不敢相信我会问这个但是 如何使用 SCALA 在 SPARK SQL 中转义 SQL 查询字符串 我已经厌倦了一切 到处寻找 我认为 apache commons 库可以做到这一点 但没有运气 import org apache comm
  • 如何更改 Handsontable 中已更改单元格的颜色?

    我正在使用 Handsontable 插件 当用户更改单元格中的值时 它应该变成黄色 以便他们可以跟踪更改的内容 在本例中 黄色是类 changeInput 棘手的部分是 当您双击单元格进行更改时 它会变成文本区域 而不再是 td 有任何想
  • 在 matplotlib 中显示表面前面的轮廓

    我一直在寻找答案 但我似乎不明白为什么在我的代码中我无法让投影轮廓显示在表面 后面 from mpl toolkits mplot3d import axes3d import matplotlib pyplot as plt from m
  • 使用 Selection 的 RangeElements 获取 Google 文档中的所有嵌套文本元素

    在类似于上面的文档中 我可以使用以下代码获取所有段落 var paras body getParagraphs 请注意 上面的代码不仅返回顶级段落 还返回内部的所有子级别段落ListItems Tables etc 如何在选定的范围内做同样
  • 如何处理 Angular 4 中的窗口滚动事件?

    我似乎无法捕获窗口滚动事件 在几个网站上我发现了类似的代码 HostListener window scroll onWindowScroll console log Scrolling 这些片段通常来自版本 2 这在 Angular 4