javascript - 停止 JavaScript 中的函数

标签 javascript

我实现了一个 ResetTime 函数,一旦调用模态框,我就需要停止该函数。 ResetTime 函数用于 session 超时。每次有用户交互时,时间都会重置。

ResetTime函数

function ResetTime() {
    timer = SetLastResetTimeStamp((new Date()).getTime());
} 

function SetLastResetTimeStamp(timeStamp) {
    if (_localStorage) {
        _localStorage[_localStorageKey] = timeStamp;
    } else {
        _lastResetTimeStamp = timeStamp;
    }
}

用户交互检查:

AttachEvent(document, 'click', ResetTime);
AttachEvent(document, 'mousemove', ResetTime);
AttachEvent(document, 'keypress', ResetTime);
AttachEvent(window, 'load', ResetTime);

有没有办法在另一个函数中停止ResetTime函数?

最佳答案

@Phiter 建议的解决方案可行,即您可以在包含标志 modalIsOpen 的范围中定义 ResetTime,然后将其定义如下:

function ResetTime() {
  if (modalIsOpen) {
    return;
  }

  timer = SetLastResetTimeStamp((new Date()).getTime());
}

但是,我认为在模式打开时分离事件并在模式关闭时重新附加它们会更干净。这将首先阻止该函数被调用。 IE。假设您有两个函数 onModalOpenonModalClose 以及一个 DetachEvent 函数,该函数从相应的 EventTarget 中删除事件:

const onModalOpen = () => {
    DetachEvent(document, 'click', ResetTime);
    DetachEvent(document, 'mousemove', ResetTime);
    DetachEvent(document, 'keypress', ResetTime);
    DetachEvent(window, 'load', ResetTime);

    // ...
}

const onModalClose = () => {
    AttachEvent(document, 'click', ResetTime);
    AttachEvent(document, 'mousemove', ResetTime);
    AttachEvent(document, 'keypress', ResetTime);
    AttachEvent(window, 'load', ResetTime);

    // ...
}
<小时/>

注意:解除绑定(bind)和重新绑定(bind)事件处理程序并非没有争议(请参阅 this answer )。

顺便说一句,您无法停止 JavaScript(或大多数编程语言)中的函数。您只能阻止它们执行(例如,通过提前返回、抛出错误或根本不首先调用它们。)

关于javascript - 停止 JavaScript 中的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52282017/

相关文章:

javascript - Video.js 样式不覆盖默认视频样式

javascript - Bootstrap 4 - 附加侧边栏时无法保持相同的宽度

javascript - 数据过滤 Javascript(嵌套字典和数组)

javascript - 如何在数据对象中添加新属性?

javascript - Async.whilst 在 async.series 中

javascript - 基于白名单 ID 数组过滤响应对象

javascript - 将 for 循环结果添加到一个空数组

javascript - 使用表法查找最小公倍数

javascript - 需要将下拉菜单附加到类型为 "button"的图标

javascript - 控制台执行settimeout函数时显示的匿名号码是什么?