2009-01-09 10 views
1

J'écris un morceau de code qui nécessite que le DOM d'un site Web reste bloqué pendant l'exécution arbitraire de JavaScript. Le changement d'attributs est correct mais je ne peux rien changer à la structure originale de la page!Figer le DOM en JavaScript: Remplacer les fonctions de modification du DOM comme des no-ops

Je sais en JavaScript il y a un certain nombre de base de fonctions qui peuvent modifier le DOM:

appendChild(nodeToAppend) 
cloneNode(true|false) 
createElement(tagName) 
createElemeentNS(namespace, tagName) 
createTextNode(textString) 
innerHTML 
insertBefore(nodeToInsert, nodeToInsertBefore) 
removeChild(nodetoRemove) 
replacechild(nodeToInsert, nodeToReplace) 

Ma première pensée était simplement de remplacer ces fonctions sans ops:

>>> document.write('<p>Changing your DOM. Mwwhaha!</p>') 
>>> document.write = function() {} 
>>> document.write('<p>No-op now!</p>') 

Bien qu'il soit facile à faire pour l'objet document les fonctions de modification DOM peuvent être appelées à partir de nombreux objets JavaScript différents! Si je pouvais écraser ces fonctions au plus haut niveau, cela fonctionnerait peut-être?

Mise à jour de sktrdie:

>>> HTMLElement.prototype.appendChild = function(){} 
>>> $("a").get(0).appendChild(document.createElement("div")) 
# Still works argh. 
>>> HTMLAnchorElement.prototype.appendChild = function(){} 
>>> $("a").get(0).appendChild(document.createElement("div")) 
# No-op yeah! 

Il semblerait que je pouvais rassembler les constructeurs de tous les éléments DOM et courir sur les mettre dans pas d'habitation, mais qui semble encore assez en désordre ...

Comment puis-je protéger le DOM de la modification de JavaScript arbitraire?

+0

Wow. Qu'est-ce que tu fais ça? Vraiment curieux. –

+0

J'ai un iFrame que les proxies dans une page Web montrant le site. Vous choisissez ensuite des morceaux du site en utilisant JavaScript que j'injecte - je récupère les sélecteurs CSS de ce que vous choisissez. Donc le 'DOM' doit rester le même ou les sélecteurs vont se casser (mais d'autres JavaScript devraient fonctionner comme d'habitude!) –

+0

Donc spécifiquement vous voulez arrêter le javascript qui est chargé dans le * child * iframe de modifier le DOM? –

Répondre

2

Avez-vous essayé HTMLElement .prototype.appendChild = function() {} pour remplacer les méthodes DOM à un niveau supérieur?

+0

Ceci est proche. Le problème est HTMLDivElement/HTMLAnchorElement etc. ne sera pas affecté par ceci ... –

+0

Je ne pense pas que IE a ceci intégré dans leur DOM. Peut-être les versions ultérieures mais je me souviens d'IE6 ne pas l'avoir. – bucabay

0

Ne faites pas cela. Utilisez une liste blanche. S'il vous plaît.

0

Vous pouvez éventuellement tout mettre dans une balise <div>, et masquer cette balise, en la remplaçant par une autre qui dit «Chargement ..». Ensuite, après avoir chargé, vous pouvez masquer le chargement <div> et le remplacer par l'original.

0

Il n'y a aucun moyen de le faire. J'ai fait quelques tests et peu importe comment j'ai essayé d'écraser ces méthodes, ils restent. Je crois qu'ils sont implémentés à un niveau plus élevé que l'exécutable javascript peut accéder, de sorte que vous ne pouvez pas vraiment les toucher.

1

Bien que ce soit vraiment hackish, la seule façon de maintenir la structure DOM actuelle est de stocker un "snapshot" du DOM et de le vérifier périodiquement. Probablement pas ce que vous cherchez, mais après quelques tests, c'est la seule façon que je peux penser pour maintenir la structure DOM indépendamment.