2012-03-28 3 views
0

私は、Webページの完全なHTMLツリーを横断するブラウザ拡張機能/アドインを作成しています。基本的には、node.childNodesを使用して各ノードの子ノードを取得し、次にtraversing関数を再帰的に呼び出します。私がiframeを見つけ出すまで、これは素晴らしい結果でした。 iFrameにコンテンツがあっても、node.childNodesはiframeに0の子があると常に示します。javascript、traversing html tree:iframe

これを処理する方法の例を見てきましたが(例:http://pietschsoft.com/post/2004/08/12/JavaScript-How-to-get-value-from-nested-form-in-iframe.aspx)、これらの例ではiframeの名前またはIDを知っていることを前提としています。ただし、iframeには名前やIDはなく、srcだけである可能性があります。

+0

これはクロスドメインの問題のようです。これは役立つかもしれません:http://stackoverflow.com/questions/729577/can-javascript-access-iframe-elements-from-the-parent-page –

答えて

2

ノードがiframeであることを確認するには、node.tagName == "IFRAME"をチェックします。

そうであれば、node.childNodesの代わりにnode.contentDocument.documentElementを探します。

かなりシンプルである必要があります。

+0

それは私がした:element.contentDocument.documentElement.childNodes – user984003

+0

ああ、それはいつもうまくいくわけではありません。私はときどきnode.contentDocumentが定義されていないことがあります。 James Hillの答えから、iframeの内容を取得することが常に可能ではないことがわかりますか?なぜ私はブラウザに送られたhtmlを読み込もうとしているのかというと、なぜセキュリティが「同じ起源の問題」なのか分かりません。結局のところ、Chromeで「要素を検査」をクリックすると表示されます。 – user984003

+0

インスペクタはブラウザによって信頼されています(これはブラウザであるためです)。しかし、あなたのコードはそうではありません。 iframeに別のドメインのコンテンツが含まれていると、iframeのコンテンツにアクセスできません。 –

0

iFrame内のすべての要素をトラバースする場合は、iFrameのdocumentオブジェクトにアクセスする必要があります。 擬似コード

if(currentElement == iframe) { 
    TraverseDOM(currentElement.contentDocument.documentElement); 
} 

注:のiFrameの内容が異なるドメインに由来する場合には、あなたはそれが内容だアクセスすることはできません。 Same Origin Policyを参照してください。

+1

@JamesHill、私はできれば投票しますが、(私はあなたのために)できません。 –