Heading
Paragraph.
Je me demande pourquoi MutationObserver ne détecte pas les modifications de texte effectuées à l’aide de textContent.
Heading
Paragraph.
function mutate(mutations) { mutations.forEach(function(mutation) { alert(mutation.type); }); } jQuery(document).ready(function() { setTimeout(function() { document.querySelector('div#mainContainer > p').textContent = 'Some other text.'; }, 2000); var target = document.querySelector('div#mainContainer > p') var observer = new MutationObserver( mutate ); var config = { characterData: true, atsortingbutes: false, childList: false, subtree: true }; observer.observe(target, config); });
Dans le script ci-dessus, le contenu textuel de l’élément de paragraphe change clairement, mais MutationObserver ne le détecte pas.
Toutefois, si vous modifiez textContent en innerHTML, vous serez averti que la propriété “characterData” a été modifiée.
Pourquoi MutationObserver détecte-t-il innerHTML mais pas textContent?
Voici le JS Fiddle:
https://jsfiddle.net/0vp8t8x7/
Notez que vous ne serez alerté que si vous changez textContent en innerHTML.
C’est parce que textContent
déclenche une modification différente de innerHTML
et que votre configuration d’observateur n’est pas configurée pour observer les modifications apscopes par textContent
.
textContent
change le noeud de texte enfant de la cible. Selon les parameters MDN , textContent
:
La définition de cette propriété sur un nœud supprime tous ses enfants et les remplace par un seul nœud de texte avec la valeur donnée.
Alors que innerHTML
change l’élément lui-même et son sous-arbre.
Donc, pour attraper innerHTML
votre configuration devrait être:
var config = { characterData: true, atsortingbutes: false, childList: false, subtree: true };
Alors que pour attraper textContent
utilisez:
var config = { characterData: false, atsortingbutes: false, childList: true, subtree: false };
Démo:
function mutate(mutations) { mutations.forEach(function(mutation) { alert(mutation.type); }); } setTimeout(function() { document.querySelector('div#mainContainer > p').textContent = 'some other text.'; }, 1000); var target = document.querySelector('div#mainContainer > p') var observer = new MutationObserver( mutate ); var config = { characterData: false, atsortingbutes: false, childList: true, subtree: false }; observer.observe(target, config);
Heading
Paragraph.