2009-10-30 13 views
11

クロスドメインAJAXリクエストを作成するユーザスクリプトを作成しようとしています。greasemonkeyユーザスクリプト内のjQuery.getJSON

@requireを使用してスクリプト内にjQueryを組み込み、jQuery.getJSONを実行しようとするまですべてが正常に機能しているようです。

私がアクセスしているAPIはjsonpをサポートしていますが、jsonp123456789が定義されていないというエラーが表示され続けます。

私がこれを集めることができたのは、jQueryがjsonpレスポンスをページの先頭に直接書き込むことであり、それがサンドボックスになります。それが起こると、jQueryはコールバックにアクセスできなくなり、その結果、未定義になります。 (私はこの場合100%ではないが、私にはそう思われる)。

これを回避する方法はありますか?私はunsafeWindowの中にコールバック関数を宣言することを提案されていますが、これをどうやって行うのかは分かりません。

答えて

16

jQueryが内部でGM_xmlhttpRequestを使用していて、jQueryメソッドとGreasemonkeyのクロスサイト機能のすべての利便性を備えているといいのではないでしょうか? mahemoffが指摘するように、GreasemonkeyはJSONPに頼ることなく、直面しているコールバックの問題にぶち込まずにリクエストを行うことができますが、JSONの内容を自分で処理する必要があります。

ちょうどそれを行うライブラリ:Greasemonkey/jQuery XHR bridgeを作成しました。あなたのユーザスクリプトに@requireというスクリプトがあれば、すべて$.get$.getJSON$.postなどです。jQueryコールは、JSONPのような技術に頼らずにクロスサイトで動作します。

このブリッジを使用してURLから?callback=?を単に削除すると、jQueryコードが変更されずに動作するはずです。 This blog postは、ステップバイステップのウォークスルーを提供します。誰かが質問、コメント、バグレポート、またはブリッジプラグインに関する提案がある場合は、私に知らせてください。

+1

こんにちはニック、 私は最初にこの問題に取り組んだときにあなたのスクリプトに出くわしましたが、私は仕事をして放棄するためにコールバックを削除する必要があることに気づいていませんでした。 この質問にお返事いただきありがとうございました。 –

+0

ちょうどこれが治療を働かせたことを付け加えたいと思っています:) –

+0

ありがとう、私の仕事はずっと簡単でした! – GrayB

8

回避策は、GM_HttpRequestを使用することです。通常のXHRと違って、ドメイン間の呼び出しを許可するため、クロスドメインリクエストのJSONPではなく、そのままにすることができます。

GM_xmlhttpRequest({ 
    method: "GET", 
    url: "http://example.com/path/to/json", 
    onload: function(xhr) { 
     var data = eval("(" + xhr.responseText + ")"); 
     // use data ... 
    } 
    }); 

この評価版のJSONは最も簡単な方法です。信頼できないJSONのより安全なソリューションをご希望の場合は、a small JSON-parsing libraryを含める必要があります。

残念ながら、あなたはまた、全体の周りにwrap a seemingly useless zero-duration setTimeoutする必要があります。 GM_xmlhttpRequestを独自のメソッドにスティックし、setTimeout(makeCall、0);を実行するのが最も簡単です。

real example hereが表示されます。

+1

これは実際に私のために完全に働きました。 – roim

1

多くの人が知っているように、Google Chromeは現時点で便利なGM_機能をサポートしていません。このように、それはさまざまなサンドボックスの制限のため、クロスサイトAJAX要求を行うために不可能ある

(でもJames Padolsey's Cross Domain Request Scriptのような偉大なツールを使用して)

私のGreasemonkeyスクリプトが更新されていたとき、私は、ユーザーが知っているための方法を必要とChromeの場合(Chromeではそのようにしないため...)。私はここに文書化されている解決策を考え出した(と私のLighthouse++スクリプトで使用されている)とスクリプトを確認したバージョンに望むあなたのそれらのために読む価値:

http://blog.bandit.co.nz/post/1048347342/version-check-chrome-greasemonkey-script

関連する問題