可见性更改未按预期运行

  • 本文关键字:运行 可见性 javascript
  • 更新时间 :
  • 英文 :


可见性更改的MDN页面指出"当选项卡的内容变得可见或隐藏时,它会触发"。但是,当我运行以下代码片段时,我立即收到无限的警报链,因此它显然不断被触发。为什么会这样?

function doEverything() {
    if(document.visibilityState == 'visible') {
        alert(document.visibilityState);
        document.removeEventListener("visibilitychange", doEverything());
    }
}
document.addEventListener("visibilitychange", doEverything());

您正在调用该函数,而不是将其作为参数传递。

document.addEventListener("visibilitychange", doEverything);

document.removeEventListener("visibilitychange", doEverything);

为什么会这样?

原因是因为你在一个永无止境的循环中不断地执行doEverything函数。

1) doEverything()首先在这里执行:

document.addEventListener("visibilitychange", doEverything());

2)doEverything()在这里进入循环,不断显示alert

function doEverything() {
    if(document.visibilityState == 'visible') {
        alert(document.visibilityState);
        document.removeEventListener("visibilitychange", doEverything());
    }
}

以上可以看作是相当于:

function doEverything() {
    if (true) {
        doEverything(); // loop
    }
}

若要解决此问题,您不希望执行该函数,而是提供该函数的引用。这是您的addEventListener()removeEventListener()中从doEverything()doEverything的简单更改:

function doEverything() {
    if(document.visibilityState == 'visible') {
        console.log('hi');
        document.removeEventListener("visibilitychange", doEverything);
    }
}
document.addEventListener("visibilitychange", doEverything);

这将仅在切换选项卡时运行一次警报。

最新更新