0

私はFirefox拡張機能を構築しており、拡張機能でresponseTextを返すajaxリクエストを作成しています.jsでresponseTextを解析したいのですが、そのリクエストを解析できません。

Web サーバーで同じコードを実行すると、完全に機能することに注意してください。以下はコードです

var myHTML = XHR.responseText;
var tempDiv = document.createElement('div');

tempDiv.innerHTML = myHTML;
tempDiv.childNodes;
tempDiv.getElementsByTagName('a'); // etc. etc.

Web サーバーでこのコードを使用すると、childNodes を解析してその値を取得できますが、Firefox 拡張機能でこの同じコードを使用すると、使用時に responseText が表示されていても、childNodes にアクセスできません。 Firefox拡張機能でそれ。

同じコードのこの無関心な動作について少し混乱しています。助けてください。

4

2 に答える 2

1

リモート サーバーから受け取った HTML コードを特権ドキュメントに直接挿入しないことをお勧めします。これはセキュリティ上の脆弱性です。サーバーを制御していて、サーバーがハッキングされることはないと確信している場合でも、途中でデータが変更されている可能性があります。innerHTML を使用すると、HTML コードと一緒に送信された JavaScript コードを実行でき、その JavaScript コードは拡張機能の特権で実行されます (つまり、ほとんど何でも実行できます)。

代わりに を作成し、<iframe>ドキュメントとそのフレームの間にセキュリティ境界があることを確認する必要があります (type="content" がそれを行います)。このようなもの:

var myHTML = XHR.responseText;
var tempFrame = document.createElement("iframe");
tempFrame.setAttribute("type", "content");
tempFrame.setAttribute("src", "data:text/html;charset=utf-8," + encodeURIComponent());
document.documentElement.appendChild(tempFrame);
tempFrame.contentWindow.addEventListener("load", function()
{
    tempFrame.contentDocument.documentElement;
    tempFrame.contentDocument.getElementsByTagName('a');
    ...
    tempFrame.parentNode.removeChild(tempFrame);
}, false);

もちろん、整形式の XML があれば、作業はより簡単になります。次に、それを解析することは、単に次の問題です。

var doc = new DOMParser().parseFromString(XHR.responseText, "text/xml");
doc.documentElement;
doc.getElementsByTagName('a');

編集:これを書いた後、状況が変わりました-Firefox 10以降、DOMParser()整形式ではないHTMLコードにも使用できます。したがって、HTML コードからデータを抽出する必要があるだけの場合は、フレームではなくparseFromString(..., "text/html").

于 2011-06-06T19:19:31.557 に答える
0

セッターの動作は、現在innerHTMLのドキュメントの種類によって異なります。Firefox chrome は XML ドキュメントであるため、myHTML上記のスニペットでは文字列が XML として解析されます。Web ページでは、おそらく XML ではなく HTML を書いていたので、HTML の構文解析を取得しています。あなたの文字列はたまたま HTML ではOKですが、整形式の XML ではありませんか?

于 2011-06-01T04:15:47.473 に答える