Событие размытия входного поля не запускается, пока не задано отображение ни для родительского элемента в Firefox - PullRequest
0 голосов
/ 19 октября 2018

У меня есть поле ввода в моем элементе Div.У меня есть фокус текстового поля с помощью мыши.При нажатии любой клавиши я буду скрывать элемент div с помощью display: none Пока элементы скрываются, событие размытия для элемента ввода запускается в Chrome, но событие размытия не запускается в браузерах Firefox и IE.

Для справки, пожалуйста,запустите приведенный ниже образец.

https://www.w3schools.com/code/tryit.asp?filename=FWDH988538TX

Шаги для воспроизведения:

Запустите образец.Откройте окно консоли. Сфокусируйте текстовое поле с помощью мыши.Пока курсор находится внутри текстового поля, нажимайте любые клавиши.Проверьте консоль.Будет запущено событие Blur.

Но это не работает в Firefox

Ответы [ 2 ]

0 голосов
/ 19 октября 2018

Следующая демонстрация покажет это поведение с использованием Chrome или Firefox:

  • Когда пользователь пытается ввести в <input>, <label>, который охватывает <input>, становится display:none.

    • Если событие начинается с <input>, это должно быть событие, которое теряет фокус (например, blur, focusout, change ...),Что бы это ни было, функция обратного вызова должна регистрировать в консоли два элемента:

      1. called

      2. <body></body> // как activeElement ошибка 452307

Firefox не запускается при событии blur, но это происходитпожар на событии input.В демоверсии есть пользовательская функция с именем: addListener(), которая может регистрировать несколько событий на одном узле.Эта функция регистрирует blur и input на <input>.

Демо

<html>

<head>
  <style>
    #box {
      height: 500px;
      width: 500px;
      border: 1px solid red;
      display: block;
      position: relative;
    }
  </style>
</head>

<body>
  <form id='form'>
    <fieldset id='box'>
      <input id='key' type="text" />
    </fieldset>
  </form>
  <script>
    var ui = document.forms[0].elements;
    var box = ui.box;
    var key = ui.key;

    box.addEventListener('keydown', closeBox);

    function closeBox(e) {
      e.target.style.display = 'none';
    }

    addListeners(key, 'input blur', triggerOnExit);

    function triggerOnExit(e) {
      console.log('called');
      console.log(document.activeElement);
    }

    function addListeners(node, list, callBack) {
      list.split(' ').forEach(function(e) {
        node.addEventListener(e, callBack);
      });
    }
  </script>

</body>

</html>
0 голосов
/ 19 октября 2018

Проблема в том, что разные браузеры выбирают обработчики событий в разных порядках.SP самым простым решением будет проверка activElement в вашем методе OnWrapperClose

var a = document.getElementById('blur');
function onWrapperClose(e) {
                        document.getElementById('Wrapper').style.display = 'none';
                        console.log(document.activeElement);

                    if(document.activeElement === a){
// do what you wanted to do on blur function   
                }

Вы можете использовать Firefox, который дает activeElemnt, поскольку в Chrome вы получаете тег body, возможно, вы захотите добавить родительский div для упрощения отладки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...