2011-01-28 10 views
0

DOMNodeのinsertBeforeメソッドを呼び出そうとしたときに、ノードが挿入されるノードが別のドキュメントからのものである(つまり、参照ノードノードが挿入されていないPHPランタイムはDOMExceptionを生成し、そのメッセージは 'No Modification Allowed Error'です。PHP DOMNode insertBefore(変更不可能なエラー)

文書が挿入されていることについてのいくつかの言及はの読み取り専用ですが、この問題では文書が疎であるようです。

私が見つけた回避策は、別のドキュメントのノードをクローンし、クローンを挿入することです。例:

foreach($nodeChildren as $child) { 
    $clone = $child->cloneNode(true); 
    $parentNode->insertBefore($clone, $nodeToInsertInFrontOf); 
} 

私の質問は2つあり:

1)なぜ私は挿入を実行するために、このノードのクローンを作成する必要がありますか?

2)この操作を実行する最も効率的な方法です(クローンされた子ノードに複数の子といくつかのレベルの階層が含まれていると仮定します)。

+0

プロットが濃くなります... 削除するノードから子ノードを移動しようとすると、同じエラーが発生します。例: $ parent-> insertBefore($ childOfA、$ A); // error –

答えて

1

DOM内のオブジェクトは、定義されているので、それ自身のドキュメント内のオブジェクトのみを認識します。それはセキュリティの問題です。

+1

あなたは「セキュリティの問題」と言いますが、私は確信していません。私はこれがセキュリティと関係していることを示唆する文書を見つけることはできませんでした。 –

+0

別のドメインに読み込まれているiframeのjavascriptでDOMにアクセスしてみてください。それは同じプリンシパルです。 DOM要素は、同じ文書内の要素にしかアクセスできません。 –

+0

これはPHPのDOMを調整する意味がありません。私たちが持っているのは、私たち自身のPHPプロセスだけです。 – Gherman

関連する問題