Greasemonkeyのスクリプトで、


function callback(data) { ... }
(function() {
  var script = document.createElement('script');
  script.type = 'text/javascript';
  script.src = 'http://foo.com/bar.json?callback=callback';
  document.body.appendChild(script);
})();

のように書いたのですが、呼び出したJSONP側で
「callback is not defined」とエラーが出てしまいます。

なぜこの場合、JSONP側で関数callbackを参照できないのでしょうか。
原因のわかる方がいらっしゃいましたら教えてください。

(ChromeとFirefox3.6で試しましたがいずれも同じエラーが出ました。
 ちなみに呼び出しているのははてなのマイブックマーク全文検索APIで、
 これはcallbackを指定したJSONPでのデータ取得をサポートしています。)

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2010/10/16 16:56:40
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:Cherenkov No.1

回答回数1504ベストアンサー獲得回数493

ポイント60pt

GM_xmlhttpRequestを使ってJSONを取得すればよいのではないでしょうか。

// 例
GM_xmlhttpRequest({
  method: "get",
  url: "http://b.hatena.ne.jp/ユーザーid/search/json",
  data: "q=greasemonkey",
  onload: function(res) {
    console.log(JSON.parse(res.responseText))
  }
});

そもそもJSONPはドメインを越えられないXHRの代替品なのだから、ドメインの制約を受けないGM_XHRがあるんだからはじめからGM_XHRで読み込んで…

Greasemonkeyで定義した関数をJSONPで呼び出したい - ロックスターになりたい


JSONPでやりたい場合は、function callbackの部分もdocument.body.appendChildすればよさそうです。

Greasemonkey で JSONP の Callback 関数を呼び出す方法 - sukechan.net

その他の回答1件)

id:Cherenkov No.1

回答回数1504ベストアンサー獲得回数493ここでベストアンサー

ポイント60pt

GM_xmlhttpRequestを使ってJSONを取得すればよいのではないでしょうか。

// 例
GM_xmlhttpRequest({
  method: "get",
  url: "http://b.hatena.ne.jp/ユーザーid/search/json",
  data: "q=greasemonkey",
  onload: function(res) {
    console.log(JSON.parse(res.responseText))
  }
});

そもそもJSONPはドメインを越えられないXHRの代替品なのだから、ドメインの制約を受けないGM_XHRがあるんだからはじめからGM_XHRで読み込んで…

Greasemonkeyで定義した関数をJSONPで呼び出したい - ロックスターになりたい


JSONPでやりたい場合は、function callbackの部分もdocument.body.appendChildすればよさそうです。

Greasemonkey で JSONP の Callback 関数を呼び出す方法 - sukechan.net

id:yume-373 No.2

回答回数8ベストアンサー獲得回数0

ポイント10pt

どこか間違っているかもしれないのでもういちど確認してみて下さい。

  • id:Cherenkov
    GreasemonkeyでJSONPを扱うサンプル書いてみました。
    「lleval」という、コードを投げると出力結果をJSONPで返すサービスを使いました。
    言語はJSで、1+2を投げるとJSONPにより3が出力されます。
    unsafeWindowを使ってグローバルに注入するほうが文字列でやるより楽でしたね。
    http://gist.github.com/628504
  • id:Cside
    なんと、わざわざありがとうございます。
    とても詰まっていたので本当に嬉しいです。
  • id:Cherenkov
    やっぱりJSONでやるのがスマートかと。
    回答1のGM_xmlhttpRequestの例は間違っていました。
    dataはpost時に使うものでした。
    たぶんこれで。

    var query = encodeURIComponent("あとで読む");
    GM_xmlhttpRequest({
    method: "get",
    url: "http://b.hatena.ne.jp/ユーザーid/search/json?q=" + query,
    onload: function(res) {
    console.log(JSON.parse(res.responseText))
    }
    });
  • id:Cside
    ありがとうございます。
    手元で動かしてみましたが、GM_xmlhttpRequestだと、
    XMLHttpRequestと同じ感じに、クロスドメインがアウトでエラーを吐いてしまうようです。

    コールバック関数を文字としてそのままscript要素にappenChildする方法だと問題なく動きました :)
  • id:Cside
    ↑修正です!
    GM_xmlhttpRequestでも問題なくいけました!
  • id:Cherenkov
    よかった!

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません