Событие Fire jQuery при смене div
У меня есть div, содержимое которого может изменяться различными способами: например, все его содержимое может быть перезагружено через innerHTML, или узлы могут быть добавлены с помощью методов DOM. Это, в свою очередь, может произойти через собственный javascript или косвенно через вызовы API jQuery или через другие библиотеки.
Я хочу выполнить некоторый код, когда содержимое div изменяется, но у меня есть абсолютно никакого контроля on как это изменится. Действительно я разрабатываю виджет, который может быть использован другие люди, которые могут свободно изменять содержание своих дивов, как они предпочитают. Когда внутреннее содержание этого div изменяется, форма виджета также может быть обновлена.
Я использую jQuery. Есть ли способ захватить событие, что содержание этого div изменилось, однако это произошло?
3 ответа:
можно использовать
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); } });
обновление
вы можете сохранить начальное содержание и будущие изменения с
.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, но, по крайней мере, он отлично работает в других браузерах.
попробуйте что-то вроде этого...
$('#divId').bind('DOMNodeInserted', function(event) { alert('inserted ' + event.target.nodeName + // new node ' in ' + event.relatedNode.nodeName); // parent });
IE не поддерживает это свойство, но я думаю, что ближайший к этому
propertychange
событие, которое срабатывает в ответ на изменение атрибута или свойства CSS элемента, но оно не срабатывает в ответ на изменение innerHTML, которое было бы близко к тому, что вы хотели.еще одним возможным решением является переопределение функции манипуляции jquery...
взгляните на это обсуждение..предпочтительный способ изменения элементов, которые еще не созданы (кроме событий)
нет такого события (onChange) в javascript или jQuery, вам нужно будет создать пользовательское событие.
одним из решений может быть использование lowpro для присоединения поведения в этом элементе, которым вы хотите управлять, это поведение будет сериализовать элемент, а затем построить опрос, который проверяет каждые X миллисекунд, чтобы увидеть, изменился ли элемент, если он был изменен, то вызовите ваше пользовательское событие на этом элементе.
У вас есть несколько примеров того, как использовать lowpro с jQuery здесь: http://www.learningjquery.com/2008/05/using-low-pro-for-jquery
удачи!