2017-02-08 18 views
0

Я заметил довольно странное поведение при запуске модульного теста, который передавался на 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» печатается на консоль в первый раз!

Что вызывает эта проблема и как я могу ее обойти?

ответ

2

Если бы вы быстро исследовали исходный код jquery, и кажется, что фокус на самом деле использует focusin, а код пытается отобразить на focusin. так что если вы попробуете это:

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

$ ("input [name = s]"). Focusin();

будет работать. Существует разница между фокусом и focusin вокруг пропускании:

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

Событие focusin посылается к элементу, когда он, или любой элемент внутри его, получает фокус. Это отличается от фокусного события тем, что он поддерживает обнаружение события фокусировки на родительских элементах (другими словами, поддерживает банкротство событий).

Похоже, что поведение трудно реплицировать, что должно быть вызвано другим кодом кода (возможно, lib). Хотя вышеприведенный код должен помочь обойти его.

+0

Спасибо большое! Я изменил неудачные модульные тесты и связанный код, чтобы использовать focusin, а не фокус. Я также нашел некоторые проблемы с размытием, но смена его на фокус тоже хорошо работала. :) Мне все равно нужно еще раз взглянуть на проблему и посмотреть, что ее вызывает в первую очередь. – unpollito