滚动事件监听器:空 While 循环,它是如何工作的以及为什么?

2024-04-19

这个问题是参考这个帖子 https://stackoverflow.com/questions/52025615/vanilla-js-change-active-state-of-links-when-scrolling-refactoring.

总之,要求是让导航中的链接根据当前滚动位置更改状态,我能够使此处提供的代码正常工作,但我不明白为什么要这样做的一行是

while(--index && window.scrollY + 50 < sections[index].offsetTop) {}

我本来会对原始答案发表评论,但显然,我的声誉还不够。

这是整个 JavaScript 代码

const links = document.querySelectorAll('.links');
const sections = document.querySelectorAll('section');

function changeLinkState() {
  let index = sections.length;

  while(--index && window.scrollY + 50 < sections[index].offsetTop) {}
  
  links.forEach((link) => link.classList.remove('active'));
  links[index].classList.add('active');
}

changeLinkState();
window.addEventListener('scroll', changeLinkState);

为什么需要 while 循环,既然它是空的,它不会做任何事情吗? 我尝试删除 while 循环,但最终破坏了代码。


while(--index && window.scrollY + 50 < sections[index].offsetTop) {}

这会随着每次迭代而减少索引。循环停止时window.scrollY + 50 < sections[index].offsetTop为 false,索引保留为上次“通过”检查的值。

以后更新的时候会用到links[index].classList.add('active');

也可以这样写:

while (index >= 0 && window.scrollY + 50 < sections[index].offsetTop) {
    index--
}

需要检查索引是否有足够的值(也称为不是 -1 或更低),否则当它达到 -1 时会出错,如下所示sections[-1].something不存在。

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

滚动事件监听器:空 While 循环,它是如何工作的以及为什么? 的相关文章

随机推荐

  • Iframe/CSS:强制 Iframe 适合屏幕

    我目前正在尝试让 iframe 适合我的屏幕尺寸 以及任何其他以不同分辨率使用它的用户 除非无论我尝试什么 最终都会导致 iframe 太小或高度太大导致双滚动条 iframe 和页面本身有滚动条 我的目标是让 iframe 仅适合页面宽度
  • CUDA程序导致nvidia驱动程序崩溃

    当我超过大约 500 次试验和 256 个完整块时 我的 monte carlo pi 计算 CUDA 程序导致我的 nvidia 驱动程序崩溃 这似乎发生在 monteCarlo 内核函数中 任何帮助都会受到赞赏 include
  • IMAP fetch() 返回命令错误:BAD [b' 命令参数错误。 12']

    我无法在网上找到示例 故障排除提示 并且不太确定我是否正确解释了文档 任何帮助将不胜感激 我正在连接到电子邮件服务器 并且想要阅读电子邮件主题和正文 我首先像这样建立连接 import imaplib c imaplib IMAP4 SSL
  • 如何在 Ruby 中使用模块重写静态类方法?

    module Imodule end class Some include Imodule def self imethod puts original end end Some imethod gt overrided 如何创建一个将覆盖
  • acts_as_taggable_on:如何优化查询?

    I use acts as taggable on在我当前的 Rails 项目中 在一个概述页面上 我显示了对象及其关联标签的索引 我使用以下代码 class Project lt ActiveRecord Base acts as tag
  • “Windows”键作为快捷键的一部分

    I very often open a console window while doing my development Usually Win R gt cmd gt enter However Windows also lets yo
  • 从 Android 中的“我的应用程序”发送彩信

    我想将彩信从我的应用程序发送到特定号码 我已经搜索并找到了这段代码 但我不知道这段代码是否是我需要的 我的问题是 任何人都可以向我解释这段代码 我是彩信初学者 另外 我认为这段代码是让用户从我的应用程序发送彩信 而不将其移动到本机消息收件箱
  • OpenCV GPU Farneback 光流在多线程中表现不佳

    我的应用程序使用 Opencv GPU 类gpu FarnebackOpticalFlow计算输入视频的一对连续帧之间的光流 为了加速该过程 我利用 OpenCV 的 TBB 支持在多线程中运行该方法 然而 多线程性能并不像单线程那样 为了
  • 如何在 iOS 中检查产品是否已使用应用内购买进行购买?

    我有一个应用程序集成在其中的应用程序 在我的应用程序中 我有两个用于付费应用程序购买和订阅的按钮 当用户点击 购买 时 它会检查苹果验证并购买产品 这可以正常工作 但是当购买产品时 我的购买按钮应该更改为 完成 并且当应用程序下次运行时 该
  • 同时对两个 arrayList 进行排序

    假设我有两个 ArrayList name Four Three One Two num 4 3 1 2 如果我这样做 Arrays sort num 那么我有 name Four Three One Two num 1 2 3 4 有什么
  • 撤消 git merge 到远程分支

    长话短说 我正在处理一个远程分支 my remote branch 但它在 CI 中的一些测试失败了 我被告知要重新建立 master 来解决这个问题 我做了以下事情 git checkout master git pull git che
  • R:用 gsub 替换“+”字符

    这个问题似乎完全微不足道 但我不明白为什么它不起作用 我只是想将涉及 运算符的字符变量替换为不包括 运算符的单个值 由于某种原因 gsub 和 sub 函数替换了数值但保留了运算符 关于如何克服这个问题有任何提示吗 非常感谢 data lt
  • 是否可以列出已集成到工作区的变更列表?

    实际上 是否可以获得已集成到工作区但未提交的更改列表的列表 关于什么p4 resolved 它不会告诉您确切的更改列表 但它会告诉您哪些文件版本 然后可以很容易地追溯到更改列表
  • Django Reverse 未找到参数“()”和关键字参数“{}”

    嗨 我有一个令人恼火的问题 我有一个像这样的网址模式 mproject myapp urls py url r project P
  • 如何设置visionOS中WindowGroup的大小?

    我想设置 a 的尺寸WindowGroup在visionOS上运行时为特定大小 在 iOS 和 maOS 上我们有 defaultSize对此的修饰符 当为visionOS构建时 Xcode提供了一个稍微不同的修饰符 带有一个称为深度的附加
  • 选择不同的返回重复项

    我有以下查询 SELECT DISTINCT TK TICKETID TK DESCRIPTION TK CREATIONDATE TK REPORTEDBY TK OWNER WF ASSIGNCODE FROM ticket TK IN
  • 如何在c#中创建一个完美的Singleton类?

    我想用 Singleton 类存储一些数据 据我研究 单例类只能实例化一次 但这对我不起作用 有人可以更正我的代码吗 public class MvcApplication System Web HttpApplication Single
  • 在 Android 中从 Mp3 检索元数据的最佳方法

    我一直在为 Android 开发一个小型媒体播放器应用程序 我在从音乐文件检索元数据时遇到一些问题 我一直在使用媒体元数据检索器 但事实证明这是相当麻烦的 有谁知道更好的方法来解决这个问题 如果是这样 如何实现这样的方法 我用过JAudio
  • 帕斯卡套接字

    如何在 Pascal 中使用网络套接字 这是一个来自的例子http www bastisoft de programmierung pascal pasinet html http www bastisoft de programmieru
  • 滚动事件监听器:空 While 循环,它是如何工作的以及为什么?

    这个问题是参考这个帖子 https stackoverflow com questions 52025615 vanilla js change active state of links when scrolling refactorin