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?
Wow. Qu'est-ce que tu fais ça? Vraiment curieux. –
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!) –
Donc spécifiquement vous voulez arrêter le javascript qui est chargé dans le * child * iframe de modifier le DOM? –