Захват событий и всплытие с помощью div contentEditable

Я имею дело с редактируемым содержимым div, и мне нужно иметь дело с захватом нажатий клавиш как до, так и после того, как персонаж был добавлен в div.

Мое понимание захвата и всплытия заключается в том, что событие сначала захватывается на самом высоком уровне дерева dom, а затем передается вниз, в то время как для всплытия оно начинается с самого низкого уровня и всплывает вверх по дереву.

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

Однако это не так: независимо от того, добавляется ли прослушиватель событий на этапе захвата или всплытия, содержимое div никогда не включает последний введенный символ.

Вот простой тестовый пример, чтобы попробовать это:

<div id="captureTest" contentEditable='true' style='height: 30px; width: 400px; border-style:solid; border-width:1px'></div>

<script type="text/javascript">
    var div = document.getElementById('captureTest');
    div.addEventListener("keydown", function() {alert('capture: ' + this.innerHTML)}, true);
    div.addEventListener("keydown", function() {alert('bubble: ' + this.innerHTML)}, false);
</script>

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

Мой вопрос: есть ли способ зафиксировать событие нажатия клавиши из редактируемого содержимого div и получить содержимое в том виде, в котором оно будет после нажатия клавиши? Мне нужно это для реализации функциональности typehead.

Я знаю, что могу остановить событие, а затем использовать executeCommand('insertHTML'), но это не работает при обработке удалений, возвратов, вставок и других типов вставок, так что это не решение.

Я тестирую это в Firefox 3. Я знаю, что в IE нет метода addEventListener.

Спасибо за любые предложения!


person Markus    schedule 13.04.2009    source источник


Ответы (1)


Вам нужны 2 разных обратных вызова, один для keydown, а другой для keyup или keypress (который запускается только тогда, когда элемент зарегистрировал как keydown + keyup ).

person Seb    schedule 13.04.2009