Observateur de mutation ne détectant pas le changement de texte

Je me demande pourquoi MutationObserver ne détecte pas les modifications de texte effectuées à l’aide de textContent.

HTML

Heading

Paragraph.

JavaScript

 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.