Как убедиться, что все события клавиатуры в браузере получен одним обработчиком - PullRequest
3 голосов
/ 02 ноября 2010

Я столкнулся с проблемой, касающейся событий клавиатуры, таких как событие keydown .Приложение представляет собой одностраничное веб-приложение, полностью построенное с использованием JavaScript и манипуляций с DOM.

Вся обработка клавиатуры выполняется одним обработчиком, добавленным в документ с использованием.

document.addEventListener("keydown", handler, true);

Этот обработчик затем декодируетсобытие клавиатуры и делегирует внутренний код ключа в инфраструктуру приложения.

Дерево DOM состоит только из элементов DIV и текстовых узлов.

Теперь, когда добавляется iframe с внешним HTML-документом, и онсодержит элементы, которые могут получить фокус, обойденный исходным обработчиком.Единственный способ восстановить поток ключевых событий в исходном обработчике - установить фокус на основной документ.

Таким образом, создается впечатление, что новый документ, добавленный с помощью iframe, обходит цепочку событий захвата / всплытия из исходного документа..

Это было проверено в Chrome для справки, но само приложение работает во встроенном веб-браузере в телевизионной приставке, веб-браузер основан на Webkit.

В телевизионной приставкеВ окне отсутствует интерфейс мыши, поэтому единственным вводом являются события клавиш с пульта.Это создает для нас проблему, поскольку мы не хотим потерять контроль над ключевыми событиями, когда загружаем другие страницы с помощью iframe.

Единственное решение - использовать обработчик событий для манипулирования DOM и определять, когда iframeдобавили и добавили обработчик событий главного ключа во вновь вставленный документ?Или есть метод, который гарантирует, что обработчик ключевых событий всегда получает все ключевые события в окне браузера.

EDIT

Я только что понял, что можно добавить обработчики событийк объекту окна, я также попробую это.

РЕДАКТИРОВАТЬ

Добавление обработчика события ключа к объекту окна ничего не изменило.

1 Ответ

1 голос
/ 04 ноября 2010

Решено с помощью следующего обходного пути:

    document.addEventListener("DOMNodeInserted", function (event) {
        if(event.type === "DOMNodeInserted") {
            if(event.srcElement.nodeName === "IFRAME") {
                event.srcElement.addEventListener("keypress", function(kevent) {
                    document.dispatchEvent(kevent);
                    }, true);
             }
         }
    },true);

Это распространяет ключевые события из дочерних фреймов в основной документ на этапе захвата.

...