当调用.of()然后调用.on()时,Jquery是否可能将事件推迟

Is it possible from an event to be postponed by Jquery when .off() then .on() are called?

本文关键字:调用 事件 是否 推迟 然后 of on Jquery      更新时间:2023-09-26

如果这个问题已经得到回答,我很抱歉,但尽管我已经积极搜索,但在Stackoverflow上没有找到任何相关内容。

我目前在我的一个剧本中遇到了一种非常奇怪的行为,这种行为在我看来并不自然,但可能有其原因(但我没有找到):

事实上,我的作品是这样的:通过更改表单输入(select和radio),然后调用一个程序来计算特定的数据(重量、价格等)。在这段时间里,最终产品不应该添加到购物车中,这就是为什么当我们更改表单输入时,这个提交按钮是"disabled"(由于回调,他需要一些额外的处理),并且它的on('click')监听器被off()禁用。

计算完成后,程序通过添加回调函数,告诉按钮现在可以再次点击。

实际行为是,当按钮被禁用时(在off()之后),点击按钮不会触发任何事情,但当计算结束,on()侦听器被添加回该按钮时,链接到该按钮的回调将被调用,而不需要任何操作。这对我来说非常奇怪,因为在on()侦听器返回后,它应该需要再次点击才能触发回调,但这可能是我不知道的内部复活节彩蛋或功能。

function callback () {
  // >> 
  // ...
  // <<
}
function start() {
  $(".button").off("click");
}
function finish() {
  $(".button").on("click", callback);
}
function process() {
  start();
  // >>
  // some inner ajax calls
  // <<
  finish();
}
$(".button").on("click", callback);

你知道发生了什么事吗?

非常感谢您的关注,如果您需要更多信息,请随时询问。

编辑:正如所问,这是我为介绍我的案例而设置的一个Fiddle,但不幸的是,即使上下文几乎相同,我还是设法复制了上面的案例:https://jsfiddle.net/Cr3aHal0/nfon051x/21/

请参阅http://javascript.info/tutorial/events-and-timing-depth

总结:

大多数浏览器对UI和JavaScript使用单线程,这会被同步调用阻止。(您在offon之间的代码是同步呼叫)

因此,JavaScript执行会阻止渲染。事件是异步处理的,DOM事件除外。

当异步事件发生时,它会进入事件队列。

浏览器有一个内部循环,称为事件循环,用于检查队列、处理事件、执行功能等。

例如,如果浏览器正忙于处理您的onclick,而后台发生了另一个事件(如另一次单击),则它会附加到队列中。onclick处理程序完成后,将检查队列并执行脚本。(在您的情况下,在您重新打开事件处理程序之后)


你如何在你的场景中解决这个问题?

不要关闭/打开事件处理程序,而是尝试禁用该按钮。禁用的按钮将不会获得点击事件。

或者,使用setTimeout来启用处理程序,这将在清除点击队列后发生,例如:

setTimeout(function() { $(".button").on("click", callback); }, 10);