Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   onkeydown когда окно/вкладка не в фокусе (https://javascript.ru/forum/events/61990-onkeydown-kogda-okno-vkladka-ne-v-fokuse.html)

12345678 19.03.2016 17:02

onkeydown когда окно/вкладка не в фокусе
 
Окей, тупой вопрос и ответ, скорее всего, "Нет". Можно ли сделать так, что бы на странице срабатывали события onkeydown, onkeyup и остальные подобные когда окно броузера (или его вкладка) не в фокусе?

Dilettante_Pro 21.03.2016 11:43

Цитата:

Сообщение от 12345678 (Сообщение 411440)
Окей, тупой вопрос и ответ, скорее всего, "Нет". Можно ли сделать так, что бы на странице срабатывали события onkeydown, onkeyup и остальные подобные когда окно броузера (или его вкладка) не в фокусе?

Прежде всего, совершенно непонятно, зачем это может быть нужно?
Ответ на вопрос - и нет, и да.
Нет - потому что на вкладке не в фокусе события такого типа не могут произойти естественным образом.
Да - такие события можно сгенерировать.
Пример первый - генерация события через заданный интервал.
<!DOCTYPE html>
<html>
<head>
    <title>First Page Interval</title>
    <script>
        var count = 0;
        function changevalue(item) {
            item.value = (count++).toString();
        }
        setInterval(function () {
            var event = document.createEvent("Event"); 
            event.initEvent("keydown", true, true);
            var item = document.getElementById('test');
            item.dispatchEvent(event);
        }, 1000);

    
    </script>
</head>
<body>
   <input type="text" id="test" value = "" onkeydown="this.value = (count++).toString();"/>
</body>
</html>

Если этот пример открыть в первой вкладке - счетчик в инпуте будет обновляться с использованием генерируемого события keydown. Если открыть вторую вкладку и через некоторое время вернуться на первое - увидим, что счетчик нарастил значение.

Второй пример - генерация события в первой вкладке по событию во второй с использованием для передачи localStorage и события storage ( идея позаимствована у Poznakomlus http://javascript.ru/forum/events/61...-stranicy.html )
Код для первой вкладки
<!DOCTYPE html>
<html>
<head>
    <title>First Page Listener</title>
    <script>
        var count = 0;
        if (window.addEventListener) {
            window.addEventListener("storage", handle_storage, false);
        } else {
            window.attachEvent("onstorage", handle_storage);
        };
        function handle_storage(e) {
            if (!e) { e = window.event; }
            var event = document.createEvent("Event"); 
            event.initEvent("keydown", true, true);
            var item = document.getElementById('test');
            item.dispatchEvent(event);
        }; 
    </script>
</head>
<body>
   <input type="text" id="test" value = "" onkeydown="this.value = (count++).toString();"/>
</body>
</html>

Код для второй вкладки
!DOCTYPE html>
<html>
<head>
    <title>Secomd Page Send</title>
    <script>
        var count = 0;
        function send_event() {
            localStorage.setItem('event', (count++).toString());    
        }
    </script>
</head>
<body>
   <input type="button" value = "Send Event" onclick="send_event();"/>
</body>
</html>

Сразу предупреждаю, что коды работоспособны в IE9+ и в Хроме - в других не проверял, не стояла задача сделать полноценные рабочие коды, а только демонстрация идей.
Конечно, ситуация совершенно бредовая, но чисто теоретически...


Часовой пояс GMT +3, время: 06:36.