2009-08-02 3 views
6

Existe-t-il un événement dans Internet Explorer, déclenché à chaque modification de DOM? Par exemple:Y a-t-il un événement onDocumentChange?

document.attachEvent("ondocumentchange", function() { 
    alert("you've just changed DOM!"); 
}); 

Et quand j'Execute:

document.appendChild(document.createElement("img")); 

fenêtre avec le texte "vous venez de changer DOM!" apparaît.

Je tente d'émuler les sélecteurs CSS "avancés" (par exemple +,>, [attr]) dans IE6 en utilisant Javascript. Cependant, pour fonctionner correctement avec le contenu dynamique, ils devraient être recalculés après chaque changement de document.

Répondre

9

"solution" Brute force: "le manque de soutien [...] du tout dans IE [...]"

(function (previousInnerHTML) { 
    return function() { 
     if (document.body.innerHTML !== previousInnerHTML) { 
      alert("you've just (at max 33ms ago) changed DOM"); 
     } 
     setTimout(arguments.callee, 33); 
    }; 
})(document.body.innerHTML)(); 
+2

Laid, mais fonctionne dans IE6. –

+0

Pourquoi utiliser un setTimeout? Dans ce cas, un setInterval n'aurait-il pas plus de sens? –

+0

Devrait quelqu'un d'autre trébucher à travers cet ancien poste, à partir de IE 11, nous avons l'option de mutationObserver https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver# –

3

Vous voulez examiner les événements de mutation dom - voir http://en.wikipedia.org/wiki/DOM_Events, et faites défiler jusqu'à la section sur les événements de mutation. Le seul problème est que la prise en charge de ces événements est assez sommaire, alors faites attention en les utilisant. Notamment, un manque de soutien du tout dans IE ou Opera. Firefox, Safari et Chrome semblent être les seuls.

Quelque chose comme:

document.addEventListener("DOMSubtreeModified", function() { 
    alert("you've just changed DOM!"); 
}); 

Selon http://www.quirksmode.org/dom/events/index.html pour ce genre d'événements que vous devez utiliser addEventListener, non attachEvent. L'événement semble bulles, donc ça devrait aller.

+2

- c'est le problème - je besoin de cet événement en raison de IE. –

+0

Peur Je ne pense pas qu'il y ait une façon de le faire alors, du moins pas sans récurser sur l'arbre DOM manuellement. Ne pouvez-vous pas limiter les modifications à un nœud enfant spécifique? – Kazar

+0

Les événements de mutation ont été déconseillés, mutationObserver est disponible depuis IE 11 https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver# –

1

Du haut de ma tête, ce pourrait travail:

document.body.attachEvent('onpropertychange', function(event) { 
    if (event.propertyName !== 'innerHTML') return; 
    alert("you've just changed DOM!"); 
}); 

Cela repose sur [événement onPropertyChange] propriétaire de IE (http://msdn.microsoft.com/en-us/library/ms536956(VS.85).aspx) - depuis innerHTML de document changerait chaque fois qu'un nœud est inséré Mais.:

  1. il pourrait ne pas fonctionner avec certains types de propriétés. J'imagine innerHTML fonctionnerait comme un « getter » en ce qu'elle avait seulement quand se recalculé rEtri eved.

  2. Il serait également ramasser beaucoup de faux positifs - beaucoup d'autres choses modifieraient la innerHTML qui aurait rien à voir avec l'insertion de noeud. Vous pouvez atténuer cela en écoutant un élément particulier, plutôt que sur l'ensemble du document.

+1

Malheureusement, "Modification du' innerText' ou 'innerHTML' de Les éléments enfants ne provoqueront pas l'exécution de l'événement __onpropertychange__ pour l'élément parent ", indique la documentation. Et même lorsque la fonction est attachée à chaque élément DOM, elle n'est pas appelée si j'utilise les fonctions de manipulation DOM - seulement si innerHTML est directement modifié. –

Questions connexes