1

documentFirefox/Greasemonkey ユーザースクリプト内のHTML ページを取得したいと考えています。

編集:これはクロスドメイン リクエストではありません。

これが私のコード例です:

var r = new XMLHttpRequest();
r.open("GET", document.location.href, true);
r.responseType = "document";
r.send(null);

これはhttps://developer.mozilla.org/en/HTML_in_XMLHttpRequestの例とまったく同じように見えますがr.send(null)TypeError. スローではなく、原因!行を a でラップしてtry...catchも何も変わりません。コールバックまたはイベント ハンドラーが例外を発生させるようです。

TypeError: document.location is null

トレースバックは Firefox の内部event.jsファイルを参照していますが、私のスクリプトは参照していません。

行設定を削除するresponseTypeと例外が削除されますが、コールバックを追加すると、例外は削除されません。ただし、応答は有効でありresponseXML、DOM ツリーを提供します。FF13.0.1を使用しています。

何か不足していますか、それともバグですか?

解決策:これは、Firefox ではなく、Mozilla の Addon Builder によって作成された拡張機能に関係していました。

4

2 に答える 2

2

スクリプトが実行されていてgoogle.com、 を取得しようとしていますよgoogle.deね? これはクロスドメイン リクエストです。 (また、質問コードは の有効な同期または非同期使用ではありませんXMLHttpRequest。)

Greasemonkey スクリプト (または Chrome) でクロスドメイン (またはそうでない) AJAX を実行するには、GM_xmlhttpRequest(). 現在、 を指定することはできませんが、この場合は指定する必要がないことに
注意してください。適切に解析されたドキュメントが必要な場合は、 を使用します。GM_xmlhttpRequest()responseTypeDOMParser

すべてを一緒に入れて:

GM_xmlhttpRequest ( {
    method:     'GET',
    //url:        'https://www.google.de/',
    url:        location.href,  // self get, checking for updates
    onload:     function (respDetails) {
                    processResponse (respDetails);
                }
} );

function processResponse (respDetails) {
    // DO ALL RESPONSE PROCESSING HERE...
    var parser  = new DOMParser ();
    var doc     = parser.parseFromString (respDetails.responseText, "text/html");

    //--- Example showing that the doc is fully parsed/functional...
    console.log (doc.querySelectorAll ("p") );
}




PS: これは結局のところクロスドメインではないため、元のコードは次のように修正されます。

var r           = new XMLHttpRequest();

r.onload        = function () {
    // DO ALL RESPONSE PROCESSING HERE...
    console.log (this.response.querySelectorAll ("div") );
}
r.open ("GET", location.href, true);
r.responseType  = "document";
r.send (null);

非同期リクエストの場合。

于 2012-07-19T08:32:28.387 に答える
0

残念ながら、あるドメインから別のドメインに Ajax を実行することはできません。

http://en.wikipedia.org/wiki/Same_origin_policy

CORS を読み取ることができます。

http://en.wikipedia.org/wiki/Cross-origin_resource_sharing

または可能な解決策としてJSONP:

http://en.wikipedia.org/wiki/JSONP

ただし、ブラウザは、セキュリティ上の問題により、ドメイン間でランダムに Ajax リクエストを作成できないように設計されています。

別のドメインからコンテンツを取得する必要がある場合は、cURLを使用して独自のサーバー API を作成し、同じドメインで独自のコンテンツを提供してから、そこで Ajax を使用することを検討します。それ以外の場合は、Google が CORS アクセスを許可するか、JSONP リクエストが組み込まれているかを確認する必要があります。

于 2012-07-19T08:06:49.900 に答える