Предположим, я прикрепляю blur
функцию к блоку ввода HTML следующим образом:
<input id="myInput" onblur="function() { ... }"></input>
Есть ли способ получить идентификатор элемента, вызвавшего blur
событие (элемент, по которому щелкнули) внутри функции? Как?
Например, предположим, что у меня есть диапазон, как это:
<span id="mySpan">Hello World</span>
Если я щелкну на промежутке сразу после фокусировки на элементе ввода, элемент ввода потеряет фокус. Как функция узнает, что на нее mySpan
щелкнули?
PS: Если бы событие onclick диапазона произошло до события onblur входного элемента, моя проблема была бы решена, потому что я мог бы установить некоторое значение состояния, указывающее, что конкретный элемент был нажат.
PPS: фон этой проблемы заключается в том, что я хочу, чтобы внешний элемент управления автозаполнения AJAX (из активируемого элемента) запускался, чтобы показать его предложения, без немедленного исчезновения предложений из-за blur
события в элементе ввода. Поэтому я хочу проверить в blur
функции, был ли нажат один конкретный элемент, и если это так, игнорировать событие размытия.
источник
Ответы:
Хм ... В Firefox вы можете использовать
explicitOriginalTarget
элемент, на который вы нажали. Я ожидалtoElement
сделать то же самое для IE, но, похоже, он не работает ... Однако вы можете извлечь недавно сфокусированный элемент из документа:Предостережение: этот метод не работает для изменений фокуса, вызванных перелистыванием полей с помощью клавиатуры, и вообще не работает в Chrome или Safari. Большая проблема с использованием
activeElement
( за исключением IE) является то , что она не постоянно обновляется до тех пор , послеblur
того, как событие было обработано, и может не иметь действительное значение вообще при обработке! Это может быть смягчено с помощью вариации техники, в которой Михил использовал :Это должно работать в большинстве современных браузеров (тестируемых в Chrome, IE и Firefox), с той оговоркой , что Chrome не устанавливает фокус на кнопках, которые щелкнули ( по сравнению с вкладками к).
источник
blur
события. Я обновил ответ с деталями. Вы пытались использовать activeElement для этого в Chrome или Firefox? Это дает вам размытый элемент ...2015 ответ : в соответствии с событиями пользовательского интерфейса , вы можете использовать
relatedTarget
свойство события:Для
blur
событий,Пример:
Примечание. Firefox не будет поддерживать
relatedTarget
до версии 48 ( ошибка 962251 , MDN ).источник
relatedTarget
вернется,null
если цель, получающая фокус, не является элементом ввода.tabIndex="0"
к нему атрибут, и он будет работатьЯ решил это в конце концов с помощью таймаута для события onblur (благодаря совету друга, который не является StackOverflow):
Работает как в FF, так и в IE.
источник
Можно использовать событие размытия документа вместо размытия:
источник
FocusEvent
Экземпляры типа имеютrelatedTarget
атрибут, однако, до версии 47 FF, в частности, этот атрибут возвращает ноль, из 48 уже работает.Вы можете увидеть больше здесь .
источник
Я также пытаюсь заставить Autocompleter игнорировать размытие, если щелкнул конкретный элемент и у него есть рабочее решение, но только для Firefox из-за явногоOriginalTarget
Этот код оборачивает метод onBlur по умолчанию для Autocompleter и проверяет, установлены ли параметры ignoreBlurEventElement. если он установлен, он каждый раз проверяет, является ли нажатый элемент ignoreBlurEventElement или нет. Если это так, Autocompleter не вызывает onBlur, иначе он вызывает onBlur. Единственная проблема с этим заключается в том, что он работает только в Firefox, потому что свойство visibleOriginalTarget является специфическим для Mozilla. Теперь я пытаюсь найти другой способ, чем использовать явныйOriginalTarget. Решение, которое вы упомянули, требует, чтобы вы добавили поведение onclick вручную к элементу. Если мне не удастся решить проблему явного ориджинала, думаю, я последую вашему решению.
источник
Можете ли вы изменить то, что вы проверяете и когда? Вот если вы помните, что было размыто последним:
и затем в onClick для вашего диапазона вызовите функцию () с обоими объектами:
Ваша функция может затем решить, следует ли запускать элемент управления Ajax.AutoCompleter. Функция имеет объект, по которому щелкнули, и размытый объект. OnBlur уже произошел, поэтому предложения не исчезнут.
источник
Используйте что-то вроде этого:
И тогда внутри вашей функции:
А потом:
А потом:
Финальный код:
источник
Я думаю, что это невозможно, с IE вы можете попробовать использовать
window.event.toElement
, но это не работает с Firefox!источник
Как отмечено в этом ответе , вы можете проверить значение
document.activeElement
.document
это глобальная переменная, поэтому вам не нужно предпринимать никаких действий, чтобы использовать ее в вашем обработчике onBlur:источник
Поэтому лучше всего использовать onclick для события body для косвенного понимания того, что ваш узел (event.target) находится в размытом состоянии.
источник
Работает в Google Chrome v66.x, Mozilla v59.x и Microsoft Edge ... Решение с помощью jQuery.
Прокомментируйте свой тест в других версиях Internet Explorer.
источник
Редактировать: хакерский способ сделать это - создать переменную, которая отслеживает фокусировку для каждого элемента, который вас интересует. Так что, если вам важно, чтобы myInput потерял фокус, установите для него переменную focus.
Оригинальный ответ: Вы можете передать «это» функции.
источник
Я предлагаю использовать глобальные переменные blurfrom и blurto. Затем настройте все элементы, которые вам нужны, чтобы назначить их положение в DOM для переменной blurfrom, когда они теряют фокус. Кроме того, сконфигурируйте их так, чтобы при получении фокуса переменная blurto заняла их положение в DOM. Затем вы можете использовать другую функцию для анализа данных размытия и размытия.
источник
имейте в виду, что решение с явнымOriginalTarget не работает для переходов ввода текста в ввод текста.
Попробуйте заменить кнопки следующими текстовыми вводами, и вы увидите разницу:
источник
Я играл с этой же функцией и обнаружил, что FF, IE, Chrome и Opera имеют возможность предоставлять исходный элемент события. Я не тестировал Safari, но думаю, что он может иметь что-то похожее.
источник
Мне не нравится использовать тайм-аут при кодировании javascript, поэтому я бы сделал это противоположным образом, как Михил Боркент. (Не пробовал код, но вы должны понять).
В голове что-то подобное
источник
Вы можете исправить IE с помощью:
Похоже, что "visibleOriginalTarget" для FF.
Антуан И Дж
источник
Я написал альтернативное решение, как сделать любой элемент фокусируемым и «слепым».
Он основан на создании элемента как
contentEditable
и скрытии его визуально и отключении самого режима редактирования:DEMO
Примечание. Протестировано в Chrome, Firefox и Safari (OS X). Не уверен насчет IE.
Связанный: я искал решение для VueJ, поэтому для тех, кому интересно / интересно, как реализовать такую функциональность с помощью директивы Vue Focusable, пожалуйста, посмотрите .
источник
Сюда:
Или, если вы присоединяете слушателя через JavaScript (jQuery в этом примере):
Изменить : извините. Я неправильно понял вопрос.
источник
Я думаю, что это легко возможно через jquery, передавая ссылку на поле, вызывающее событие onblur в «this».
Например,
Спасибо
моника
источник
Вы можете сделать это так:
источник
Я вижу только хаки в ответах, но на самом деле есть встроенное решение, очень простое в использовании: в основном вы можете захватить элемент фокуса следующим образом:
https://developer.mozilla.org/en-US/docs/Web/API/DocumentOrShadowRoot/activeElement
источник