Я пишу фрагмент кода, который требует, чтобы DOM
веб-сайта оставался замороженным во время работы произвольного JavaScript. Изменение атрибутов - это хорошо, но я не могу ничего изменить в исходной структуре тегов страницы!
Я знаю, что в JavaScript есть базовое количество функций, которые могут изменять DOM
:
appendChild( nodeToAppend )
cloneNode( true|false )
createElement( tagName )
createElemeentNS( namespace, tagName )
createTextNode( textString )
innerHTML
insertBefore( nodeToInsert, nodeToInsertBefore )
removeChild( nodetoRemove )
replacechild( nodeToInsert, nodeToReplace )
Моя первоначальная мысль состояла в том, чтобы просто переписать эти функции без всяких операций:
>>> document.write('<p>Changing your DOM. Mwwhaha!</p>')
>>> document.write = function() {}
>>> document.write('<p>No-op now!</p>')
Хотя это легко сделать для объекта document
, функции модификации DOM
можно вызывать из множества различных объектов JavaScript! Если бы я мог переписать эти функции на верхнем уровне, возможно, это сработало бы?
Обновление от 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!
Так что, похоже, я мог бы просто собрать конструкторы всех элементов DOM
и запустить их, вставив no-ops, но это все еще выглядит довольно грязно ...
Как я могу защитить DOM
от модификации от произвольного JavaScript?