-1

誰もがそれを見つける前に、これは多かれ少なかれ以前に尋ねられました: Greasemonkey と jQuery でリモート URL をロードする

ただし、3年前の話です。回答に示されているさまざまな方法を試しましたが、どれも機能しません。

基本的に、私の問題は次のとおりです。現在、A) ページ上のリンクを取得する、B) リンク先のページをリクエストする (同じホスト上にある)、 C) そのページで特定の値を見つける。これを達成するために、jQuery 1.7.2 と最新バージョンの Greasemonkey を使用しています。

問題は、ページを正常にリクエストできても、レスポンスに対して何もできないことです。応答をコールバック外の変数に代入しようとしましたが、空になってしまいます。ページに挿入した div に応答 html を追加しようとしましたが、div で console.log を使用すると、それが空であることが示されます (firebug は実際には html を表示しますが)。コールバックが終了するとすぐに、取得された html が存在しないだけでなく、存在しなかったようなものです。

基本的に、リクエストが終了した後に実際に使用できるように、htmlを取得する方法を尋ねたいと思います。これが私が今持っているものです(ページのdivに応答を追加する前述の試みを削除しました):

function getLink(url){
    var resp;
    GM_xmlhttpRequest({
        method: 'GET',
        url: url,
        onload: function(response){
            resp = response.responseText;
        }
    });
    console.log(resp) //nothing here...

    //failed code :(
    /*$.ajax(url, {success: function(data){resp = data})
    console.log(data)*/
}

上記を意図したとおりに動作させるには、どのような魔法のコードを書く必要がありますか?

4

1 に答える 1

0

GM_xmlhttpRequest()デフォルトでは非同期で動作します。これは、onload火がconsole.log(resp) //nothing here...線のずっと後にあることを意味します。

GM_xmlhttpRequest()現在はsynchronous: trueパラメーターを取りますが、非常にバグが多いため、今のところ使用することはお勧めしません。

物事を行う正しい方法 (およびより良いプログラミングと UI の実践) は、すべてをonloadハンドラーに入れることです。

function getLink (url) {
    GM_xmlhttpRequest ( {
        method: 'GET',
        url: url,
        onload: function (response) {
            var resp = response.responseText;
            console.log (resp);

            // DO EVERYTHING THAT REQUIRES resp HERE.
        }
    } );
}

これには、特定の操作についての考え方を変える必要があるかもしれませんが、それだけの価値はあります。

于 2012-06-25T03:02:28.017 に答える