2014-12-04 63 views
1

在下面的代码,是有办法blurredByClickOnLink设置为正确的值(不使用鼠标悬停或其他鼠标事件点击发生之前设置的东西)?如果用户通过单击链接模糊了文本框,则该属性为true;如果用户通过Tab键或单击其他任何位置来模糊文本框,则为false。感谢您看一看!onblur - 如何判断点击的内容;或如何判断一个onclick事件正在等待运行

<html> 
<body> 
<input id="myInput" type="text" onblur="var blurredByClickOnLink='???'; console.log('input onblur. blurred by click on link = ' + blurredByClickOnLink);" /> 
<br/><br/> 
<a id="myLink" href="javascript:console.log('a href');void(0);" onclick="console.log('a onclick');">Link</a> 
</body> 
</html> 

回答

2

当一个事件发生在DOM上时,该事件本质上是“原子”的。这意味着事件将从事件队列中处理,并且只有这样才能处理下一个事件。这些事件不以任何方式“组合”在一起。

当你输入元素失去焦点,这将在其触发blur事件。此时,您现在可以提出有关blur的问题。但是在其他环境中不会有任何其他状态变化。接下来可能会点击link元素,这也会导致事件触发。在这种情况下,链接上的点击事件。由于这些事件一个接一个发生......首先模糊输入,然后...稍后...点击链接,您无法知道模糊发生的时间,接下来发生的事情将是点击在链接上,因为它还没有发生。

一种可能的解决办法是设置一个短定时器的输入的模糊。这个计时器可以触发另一个功能(比如100msecs),然后问这个问题..是链接点击?

这可能足以满足您的困扰。

它帮助我去思考这些问题的方法是可视化的请求队列(在一个盒子),该浏览器在处理一个接一个来改变DOM的状态。问问自己“当我处理一个请求时,我有什么需要作出决定吗?”

+0

谢谢!所以这听起来像我想要的(关于模糊事件中即将发生的点击事件的信息)无法完成,因为模糊事件知道的事情迄今为止还没有被点击。我能够使用setTimeout(在任一元素的单击事件中)来完成所需的行为。 我不熟悉的事件队列是如何工作的,但听起来好像是没有办法在模糊事件中的代码,以确定哪些是在事件队列? – Kwateco 2014-12-04 23:00:35

+0

这就是它。想象一下使用高速摄像头拍摄浏览器的交互。当您将鼠标移出输入字段时,会发生模糊事件,并且可能会在发生任何后续事件(如点击)之前处理。 – Kolban 2014-12-05 00:02:36

+0

我认为比我最初提出的问题更好的问题是:如何判断一个onblur事件是否正在等待onmousedown正在运行。与模糊和点击不同,mousedown和blur同时发生,但mousedown事件首先运行。 因此,对于一个更好的问题的具体例子: 在这个小提琴中 - http://jsfiddle.net/85r4vfqg/14/ - 可以将变量listOfBlurEventsWaitingToRun填入更有用的东西,特别是如果有多个元素会发生模糊事件?而不看activeElement?可以直接查看“事件队列”吗? – Kwateco 2014-12-24 14:49:42

相关问题