3

DOM任意のJavaScriptが実行されている間、Webサイトをフリーズしたままにする必要があるコードを書いています。属性の変更は問題ありませんが、ページの元のタグ構造を変更することはできません。

DOMJavaScriptには、 :を変更できる関数の基本数があることを知っています。

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要素のコンストラクターを収集して、それらを実行し、操作を行わないようにすることができたように見えますが、それでもかなり厄介なようです...

DOM任意のJavaScriptからの変更から保護するにはどうすればよいですか?

4

5 に答える 5

2

HTMLElement .prototype.appendChild = function(){} を試して、より高いレベルで DOM メソッドを上書きしましたか?

于 2009-01-09T20:24:30.990 に答える
1

これは本当にハックですが、現在の DOM 構造を維持する唯一の方法は、DOM の「スナップショット」を保存して定期的にチェックすることです。

//place in anonymous function to prevent global access
(function() {
  //storing the whole DOM as objects would be ideal, but too memory intensive, so a string will have to do.
  var originalDOM = document.body.innerHTML;

  var checkDOM = function() {
    if (document.body.innerHTML != originalDOM)  document.body.innerHTML = originalDOM
    //check that the code is running
    if (arbitraryCodeIsRunning)  setTimeout("checkDOM", 100);
  }
  checkDOM();
})();

おそらくあなたが探しているものではありませんが、いくつかのテストの後、DOM構造を維持するために私が考えることができる唯一の方法です.

于 2009-01-09T21:04:27.133 に答える
0

これをしないでください。ホワイトリストを使用します。お願いします。

于 2009-01-09T19:47:32.920 に答える
0

すべてを<div>タグに入れて、そのタグを非表示にして、「読み込み中..」という別のタグに置き換えることができます。次に、ロードした後、ロードを非表示にして、元のロード<div>に置き換えることができます。

于 2009-01-09T19:47:57.723 に答える
0

これを行う方法はありません。私はいくつかのテストを行いましたが、これらのメソッドをどのように上書きしようとしても、それらは残ります。それらは、実行可能な JavaScript がアクセスできるレベルよりも高いレベルで実装されているため、実際に触れることはできません。

于 2009-01-09T20:39:46.060 に答える