Событие Fire jQuery при изменении div
У меня есть div, содержимое которого может меняться различными способами: например, весь его контент может быть перезагружен через innerHTML, или узлы могут быть добавлены через DOM-методы. Это, в свою очередь, может произойти через собственный javascript или косвенно через вызовы jQuery API или через другие библиотеки.
Я хочу выполнить некоторый код, когда содержимое div изменится, но у меня нет никакого контроля, как он изменится. Действительно, я разрабатываю виджет, который может использоваться другими людьми, которые могут свободно изменять содержимое своих разделов так, как они предпочитают. Когда внутреннее содержимое этого div изменяется, форма виджета также может быть обновлена.
Я использую jQuery. Есть ли способ захватить событие, что содержимое этого div изменилось, однако это произошло?
Ответы
Ответ 1
Вы можете использовать DOMNodeInserted
и DOMNodeRemoved
, чтобы проверить, добавлены или удалены элементы. К сожалению, IE не поддерживает это.
$('#myDiv').bind('DOMNodeInserted DOMNodeRemoved', function(event) {
if (event.type == 'DOMNodeInserted') {
alert('Content added! Current content:' + '\n\n' + this.innerHTML);
} else {
alert('Content removed! Current content:' + '\n\n' + this.innerHTML);
}
});
Update
Вы можете сохранить исходное содержимое и будущие изменения с помощью .data()
. Вот пример.
var div_eTypes = [],
div_changes = [];
$(function() {
$('#myDiv').each(function() {
this['data-initialContents'] = this.innerHTML;
}).bind('DOMNodeInserted DOMNodeRemoved', function(event) {
div_eTypes.concat(e.type.match(/insert|remove/));
div_changes.concat(this.innerHTML);
});
});
Пример вывода:
> $('#myDiv').data('initialContents');
"<h1>Hello, world!</h1><p>This is an example.</p>"
> div_eTypes;
["insert", "insert", "remove"]
> div_changes;
["<iframe src='http://example.com'></iframe>", "<h4>IANA — Example domains</h4><iframe src='http://example.com'></iframe>", "<h4>IANA – Example domains</h4>"]
Обновление 2
Возможно, вы захотите включить DOMSubtreeModified
, потому что я обнаружил, что DOMNodeInserted
и DOMNodeRemoved
не запускаются, если элемент innerHTML
заменяется напрямую. Он по-прежнему не работает в IE, но, по крайней мере, он отлично работает в других браузерах.
Ответ 2
попробуйте что-то вроде этого...
$('#divId').bind('DOMNodeInserted', function(event) {
alert('inserted ' + event.target.nodeName + // new node
' in ' + event.relatedNode.nodeName); // parent
});
IE не поддерживает это свойство, но я думаю, что ближайшим к нему событием является propertychange
, которое срабатывает в ответ на изменение атрибута или свойства CSS элемента, но оно не срабатывает в ответ на innerHTML изменение, которое было бы близко к тому, что вы хотели.
еще одно допустимое решение - переопределить функцию манипуляции jquery...
Взгляните на это обсуждение.. Предпочтительный способ изменения элементов, которые еще не созданы (помимо событий)
Ответ 3
Нет такого события (onChange) в javascript или jQuery, вам нужно создать настраиваемое событие.
Одним из решений может быть использование lowpro для присоединения поведения в этом элементе, которым вы хотите управлять, это поведение приведет к сериализации элемента, а затем построит опрос, который проверяет каждые x миллисекунды, чтобы увидеть, изменился ли элемент, если он изменился, а затем триггер ваше пользовательское событие в этом элементе.
У вас есть несколько примеров того, как использовать lowpro с jQuery здесь:
http://www.learningjquery.com/2008/05/using-low-pro-for-jquery
Удачи!