You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让window.scrollY关联的滚动事件仅触发一次?

解决滚动事件仅触发一次的问题

你的核心问题是没有在触发后标记事件已执行,导致每次滚动到scrollY > 30时都会重复触发请求。下面提供两种可靠的解决方法:

方法一:用布尔变量标记状态(修复你原有代码)

给布尔变量fired添加赋值逻辑,一旦触发就将其设为true,阻止后续重复执行:

var fired = false;
window.addEventListener("scroll", function() {
    // 同时满足滚动位置和未触发过的条件
    if (window.scrollY > 30 && !fired) {
        fired = true; // 标记为已触发,后续不再执行
        fetch("https://ip2c.org/self")
            .then(response => response.text())
            .then(text => {
                if (text.includes("IND")) {
                    document.getElementById("IN").style.display = "flex";
                }
            });
    }
});

方法二:满足条件后直接移除事件监听器

这种方法更高效,一旦触发逻辑就彻底移除滚动事件监听器,避免后续不必要的事件监听:

// 给回调函数命名,方便移除
function handleScroll() {
    if (window.scrollY > 30) {
        window.removeEventListener("scroll", handleScroll); // 移除监听器
        fetch("https://ip2c.org/self")
            .then(response => response.text())
            .then(text => {
                if (text.includes("IND")) {
                    document.getElementById("IN").style.display = "flex";
                }
            });
    }
}
window.addEventListener("scroll", handleScroll);

为什么你之前的代码无效?

你仅在判断条件里加入了fired === false,但从未将fired改为true,所以每次滚动到指定位置时,fired始终是false,导致请求重复触发。

内容的提问来源于stack exchange,提问作者Blogger Templates

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 09:57:55