Прослушивание событий контент-контента HTML-элемента

Я пытаюсь выяснить, есть ли способ прослушать такие события, как focus или change элемента HTML с атрибутом contenteditable.

У меня есть эта разметка html:

<p id="test" contenteditable >Hello World</p>

Я пробовал их без каких-либо успехов (JSBin):

var test = document.querySelector('#test');
test.addEventListener('change', function(){
  alert('content edited');
}, false);
test.addEventListener('DOMCharacterDataModified', function(){
  alert('content edited');
}, false);
test.addEventListener('focus', function(){
  alert('content edited');
}, false);

Я не хочу слушать события клавиатуры или мыши. Я не нашел четкой документации в W3C и MDN около contenteditable.

Возможно ли прослушивание change и focus или других событий в редактируемом для контента HTML элементе?

Ответы

Ответ 1

Не совсем. Для contenteditable элементов нет события change, и нет события HTML5 input, хотя, я думаю, это со временем появится. Это боль.


ОБНОВЛЕНИЕ 23 июня 2012 г.

Недавний WebKit поддерживает событие HTML5 input на contenteditable, как и Firefox 14.


focus, однако, работает, как и DOMCharacterDataModified в большинстве браузеров (хотя, в частности, не IE < 9). См. http://jsfiddle.net/UuYQH/112/

Кстати, contenteditable не является логическим атрибутом: для него требуется значение, которое должно быть одним из "true", "false", "inherit" и пустой строкой (что эквивалентно "true" ).

Ответ 2

Я знаю, что это немного поздно, но jQuery, похоже, работает с фокусом, проверьте этот пример:

http://jsfiddle.net/powerphillg5/EGtSC/

$("#test").focus(function(){
     $("#log").append("<li>Item Focused</li>");
});

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

Ответ 3

Размытие (когда область теряет фокус) и фокус оба работают. По крайней мере, с jQuery. Протестировано с помощью Chrome 28 и Safari 6.

$("#test").blur(function(){
  $("#log").append("<li>Item lost focus</li>");
});

Ответ 4

contenteditable был введен обратно в IE 5.5, он поддерживался API JavaScript 1.1/1.2 и применялся сначала к iframe, а затем к DIV. В некоторой степени он поддерживается во всех браузерах. Теперь в спецификации HTML5 большинство элементов могут принять этот атрибут (но остерегайтесь обратной совместимости). поддержка событий onchange может еще применяться для формирования элементов, поскольку она была изначально разработана, что мало связано с этим атрибутом. Ваша опция по-прежнему вызывает нажатия клавиш, которые легко захватываются, и в сочетании с проверкой целевых элементов фокус у вас есть аналогичный результат для обмена. Это может быть не идеально для краевых случаев, но для большинства случаев использования я бы пошел по этому маршруту, и его самая обратная совместимость тоже.