Страницы

Поиск по вопросам

пятница, 20 декабря 2019 г.

Отловить изменение содержимого div

#javascript #jquery #widgets #javascript_events


У меня есть div, содержимое которого может меняться различными способами: например,
весь его контент может быть изменён через innerHTML, или могут быть добавлены узлы
через DOM-методы. Это может произойти через собственный javascript или через вызовы
jQuery API, или через другие библиотеки.

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

Я использую jQuery. Есть ли способ отловить изменение содержимого div?
    


Ответы

Ответ 1



MutationObserver (поддержка) const observer = new MutationObserver(mutations => console.log(mutations)); observer.observe(test, { attributes: true, childList: true, characterData: true, subtree: true }); test.innerHTML = '1'; test.classList.add('test'); test.appendChild(document.createElement('br')); test.innerHTML += '2';


Ответ 2



Вы можете использовать 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'); "

Привет мир!

Это пример.

" > div_eTypes; ["insert", "insert", "remove"] > div_changes; ["", "

IANA — Example domains

", "

IANA – Example domains

"] Возможно, вы захотите включить DOMSubtreeModified, так как DOMNodeInserted и DOMNodeRemoved не запускаются, если элементы заменены через innerHTML. Он не работает в IE, но, по крайней мере, он отлично работает в других браузерах.

Комментариев нет:

Отправить комментарий