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でのデータ取得をサポートしています。)
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で読み込んで…
JSONPでやりたい場合は、function callbackの部分もdocument.body.appendChildすればよさそうです。
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で読み込んで…
JSONPでやりたい場合は、function callbackの部分もdocument.body.appendChildすればよさそうです。
コメント(6件)
「lleval」という、コードを投げると出力結果をJSONPで返すサービスを使いました。
言語はJSで、1+2を投げるとJSONPにより3が出力されます。
unsafeWindowを使ってグローバルに注入するほうが文字列でやるより楽でしたね。
http://gist.github.com/628504
とても詰まっていたので本当に嬉しいです。
回答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))
}
});
手元で動かしてみましたが、GM_xmlhttpRequestだと、
XMLHttpRequestと同じ感じに、クロスドメインがアウトでエラーを吐いてしまうようです。
コールバック関数を文字としてそのままscript要素にappenChildする方法だと問題なく動きました :)
GM_xmlhttpRequestでも問題なくいけました!