javascript - 当调用 .off() 然后调用 .on() 时,Jquery 是否可以推迟事件?

标签 javascript jquery events delay

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

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

实际上,我的作品是这样的:通过改变表单输入(选择和单选),然后调用一个程序来计算具体数据(重量、价格等)。在此期间,最终产品不应添加到购物车,这就是为什么当我们更改表单输入时,此提交按钮为“禁用”(由于回调,他进行了一些额外的处理)及其 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 处理程序完成时,将检查队列并执行脚本。 (在您的情况下,在您重新打开事件处理程序之后)

<小时/>

How do you fix this in your scenario?

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

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

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

关于javascript - 当调用 .off() 然后调用 .on() 时,Jquery 是否可以推迟事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36912199/

相关文章:

javascript - ActionscriptExternalInterface调用未到达javascript

javascript - 每个 Ajax 数据

javascript - 动态创建的元素上的事件绑定(bind)?

c# - 如何在保持优雅事件的同时摆脱这种代码重复?

javascript - 使用下拉菜单更改多个文本框

javascript - jQuery jScrollPane 仅适用于文本

javascript - 在按下按钮时执行 jquery 自动完成

javascript - 删除导航栏的类 - 正确

JavaScript:在对象函数和绑定(bind)事件中使用 THIS

javascript - AJAX 轮询和循环