Задержка обработчика событий фокуса IE - PullRequest
3 голосов
/ 05 мая 2011

У меня проблема с обработкой события фокуса в приведенном ниже коде в IE8. Я получаю следующий вывод:

LOG: set focus txt1
LOG: set focus txt2
LOG: txt1 focus
LOG: txt2 focus

, но во всех других браузерах вывод:

LOG: set focus txt1
LOG: txt1 focus
LOG: set focus txt2
LOG: txt2 focus

itКажется, что IE8 ставит в очередь все запросы фокуса и выполняет обработчики событий после завершения текущей функции.

Есть ли обходной путь, чтобы заставить IE8 вести себя так же, как в других браузерах?

<html>
<head>
</head>
<body>
<script>
        function test(){
            console.log('set focus txt1');
            document.getElementById('txt1').focus();
            console.log('set focus txt2');
            document.getElementById('txt2').focus();
        }
    </script>
<input id="txt1" type="text" onfocus="javascript:console.log('txt1 focus')" style="width:100px" />
<input id="txt2" type="text" onfocus="javascript:console.log('txt2 focus')" style="width:100px" />
<button value="Click" onclick="javascript:test()"></button>
</body>
</html>

1 Ответ

3 голосов
/ 08 мая 2011

IE задерживает фактический фокус до тех пор, пока не будет завершена функция test(), поэтому я боюсь, что вы должны использовать такую ​​конструкцию, как:

function test(){
    console.log('set focus txt1');
    document.getElementById('txt1').focus();

    window.setTimeout(function() {
        console.log('set focus txt2');
        document.getElementById('txt2').focus();
    }, 1);
}

Здесь я откладываю вторую часть функции, чтобыIE успеет установить фокус на txt1 до выполнения второй части.

Кстати, вы должны опустить префикс javascript: в атрибутах onclick и onfocus.Префикс javascript: должен использоваться только в атрибуте href.

...