Реальная проблема здесь не в том, что сами события не являются правильными, а скорее в последовательности, в которой они происходят, а не в учете.
Когда вы сфокусированы на вводе и нажимаете кнопку,события фактически вызываются в следующей последовательности: input loses focus / blur
, document receives "click"
Также важно отметить, что само действие щелчка, по-видимому, не сразу захватывает информацию о что щелкнули, только , где щелчок имел место, и в этой ситуации элемент с фокусом теряет фокус и вызывает любых слушателей событий до новый элемент идентифицируется как цель длящелчок.
Это означает, что любые изменения, внесенные в документ во время слушателей «размытия», например, удаление целевого элемента из документа, произойдут за до того, как целевой элемент получит свой щелчокВызваны слушатели событий - или даже прежде, чем браузер вообще зарегистрирует его как «целевой» элемент.
В случае этого вопроса блок контента над кнопкой и скрытый с display:none
обнаруживается с display:block
, когда поле ввода теряет фокус, что перемещает контент, включая кнопку вниз на странице, восвободить место для его появления и, таким образом, заставить «щелчок» фактически пропустить кнопку.
Следующий Fiddle показывает рабочее решение этой проблемы, используя свойство видимости вместо display
для того, чтобы зарезервировать пространство, занимаемое скрытым сообщением, вместо того, чтобы заставлять содержимое перемещаться после его обнаружения, правильное использование которого также является лучшей практикой с точки зрения UX: https://jsfiddle.net/sdhtmk90/