在Javascript

时间:2017-06-05 16:12:27

标签: javascript events javascript-events event-handling cross-browser

这个问题可能听起来有点傻,但我真的无法得到任何具体的解决方案。

我们正在修改现有的遗留应用程序,该应用程序具有大量表单和与每个表单关联的许多元素。在大多数情况下,'onblur'事件与一个元素相关联,'onclick'事件与其他查找相关元素相关联。

仅在IE中支持遗留应用程序,该IE使用模式对话框显示验证消息,该消息用于冻结代码流,直到执行用户操作为止。但是在具有chrome支持的改进应用程序中,模态窗口不适用,并且使用promises模拟代码流冻结。

现在新方法的问题是当用户在一个元素中输入一些无效数据并尝试单击另一个查找元素时,第一个元素上的'onblur'事件和第二个元素上的'onclick'事件同时被触发导致多个窗口(一个用于验证,一个用于查找)有没有办法避免在'onblur'事件触发后发生'onclick'事件触发?是否可以避免并发事件发生?

注意:可能会有一些调整,比如在第二个元素的'onclick'事件中添加超时和移动验证逻辑来​​解决此问题。但不幸的是,我无法做到这一点,因为它是一个遗留应用程序,并且在整个应用程序中进行的更改量很大。

  

解释问题的示例代码:

<html> <head><title>Test</title></head> <body> <input type="text" onblur='setTimeout(function(){window.open("http://www.google.com", "BlurWindow","");},5000)' /> <input type="button" onclick='setTimeout(function(){window.open("http://www.bing.com", "ClickWindow","");},5000)' value="popup" /> </body> </html>

当我在文本框中键入一些文本并单击弹出按钮时,“onclick”和“onblur”事件都会被触发。我需要一些方法来处理并发事件触发。可能吗?提前致谢

1 个答案:

答案 0 :(得分:0)

我们无法控制事件发射的顺序。因此我们做了一个解决方法来解决问题。我们正在捕获变量中的当前聚焦元素并且点击任何其他按钮元素,如果聚焦元素变量不为null,我们将阻止按钮的onclick事件触发。

伪码如下:

捕捉重点元素:

$(":input[type=text]").on('focusin', function () { window.top.prevFocusField = $(this); });

阻止点击操作:

if (window.top.prevFocusField != null) { return; }