【发布时间】:2015-11-20 06:12:51
【问题描述】:
我有一个侦听“mouseenter”事件的 div,并在 5 秒后触发 libraryFunction(我无法编辑)(使用 setTimeout 实现)。
但是,如果用户在这 5 秒内点击了 div,则 setTimeout 应该被取消,并且该函数不应该运行(通过 clearTimeout 实现)。点击也会移除 libraryFunction 所依赖的元素。
目前我有以下代码:
var timeoutVar;
$("#mydiv").on("mouseenter", function(event) {
timeoutVar = setTimeout(function() {
runLibraryFunction(object);
}, 5000);
});
$("#mydiv").on("click", function(event) {
clearTimeout(timeoutVar);
removeObject(object);
});
这在大多数情况下都有效,但是,在 5 秒后单击 div 并且在执行 runLibraryFunction() 时存在边缘情况。 因为“click”事件会移除 runLibraryFunction 需要的对象,而这发生在 runLibraryFunction 运行时,runLibraryFunction 会抛出错误。
有没有办法在 runLibraryFunction() 调用被触发后停止它?
【问题讨论】:
-
对象点击后需要移除什么?
-
这看起来像一个 XY 问题,您在完成后在
runLibraryFunction函数的末尾删除removeObject()怎么样? -
我建议,在超时触发点击事件中,而不是直接调用函数。这将使代码流更加清晰。同样,一旦点击被触发,您可以设置像
processing这样的标志,并且仅在其 false 状态下调用函数。 -
另外,您可以在
setTimeout函数中runLibraryFunction之前的.off()click事件。这样如果它开始运行库函数,那么就没有回头路了。只会有两种情况:在 5 秒过去之前点击 - 对象已被移除; 5 秒过去了 - 库函数将运行并完成执行。 -
这闻起来像是设计缺陷,需要检测或避免删除。
标签: javascript jquery