第一个元素之后没有触发元素焦点侦听器.focus()

时间:2017-02-08 12:14:40

标签: javascript jquery dom-events jquery-events

我注意到在运行PhantomJS但在Chrome,Firefox和IE中偶尔失败的单元测试时会出现一种奇怪的行为。简而言之:

  • 我为DOM元素设置了一个焦点监听器。
  • 我调用了element.focus(),但是监听器没有运行。
  • 第二次调用element.focus()实际上是在监听器上运行。

不幸的是,我无法在小提琴中重现这个问题,但可以在jQuery的网站上完成。我在Chrome上执行以下步骤:

  1. 打开www.jquery.com,然后打开DevTools。
  2. 运行$("input[name=s]").on("focus", () => console.log("a"));
  3. 运行$("input[name=s]").focus();。没有生成输出。
  4. 运行$("input[name=s]").focus();。现在,“a”首次打印到控制台!
  5. 是什么导致了这个问题,我该如何解决它?

1 个答案:

答案 0 :(得分:2)

快速浏览jquery源代码,似乎焦点实际上使用了focusin,并且代码正试图映射到focusin。所以如果你试试这个:

  

$(“input [name = s]”)。on(“focusin”,()=> console.log(“a”));

     。

$( “输入[名称= S]”)的focusIn();

它会起作用。焦点和焦点在冒泡之间存在差异:

http://api.jquery.com/focusin/

  

当focusin事件或其中的任何元素发送到该元素时,它将被发送到该元素   它,获得焦点。这与焦点事件不同   支持检测父元素上的焦点事件(换句话说,   它支持事件冒泡)。

似乎行为是一个难以复制的错误,这必定是由其他位置的代码(可能是lib)引起的。虽然上面的代码应该有助于解决它。