- 2009-03-05 (木) 22:45
- JavaScript
とあるグリモンを作っていて、JSONP をサポートしている API にリクエストを投げて、Callback 関数で結果を受け取りたい。例えば以下のような URL。
http://example.com/api?data=hoge&callback=fuga
無名関数内でこの JSONP を呼び出しても fuga は当然実行されないので、グローバルにオブジェクトを 1 つ作り(名前空間的なものです)、その中に Callback 関数を定義してみました。
Safari ではちゃんとグローバルになるんですが、Firefox ではグローバルにならず。
原因が分からずいろいろ調べてみたところ、Greasemonkey として実行される場合、前後に (function() { ~ })(); が付くらしい(Safari では付かない)。
次に、Callback パラメータ内にイベントを作成して、Callback 時にイベントを発生させられないかと思って試してみましたが、こちらは Safari で結果を受け取る方法が分からず断念。
(function() {
// Callback
document.addEventListener("onJSONPLoad", function(request) {
alert('callback');
});
// JSONP 実行
var s = document.createElement('script');
s.type = 'text/javascript';
s.charset = 'UTF-8';
s.src = 'http://example.com/api?data=hoge&callback=(function(result){var%20c=document.createEvent(%22HTMLEvents%22)%3bc.initEvent(%22onJSONPLoad%22,true,true)%3bdocument.dispatchEvent(c)%3b})';
document.body.appendChild(s);
})();
仕方ないので、script タグを動的に生成して、グローバルに 1 つ名前空間を作り、その中に関数を定義。
(function() {
// JSONP 実行
var s = document.createElement('script');
s.src = param.url + '&callback=my_ns.json_callback';
s.charset = 'UTF-8';
document.body.appendChild(s);
// Callback
var s = document.createElement('script');
s.type = 'text/javascript';
s.charset = 'UTF-8';
var t = document.createTextNode("var my_ns = { callback: function(r) { alert('callback'); } }");
s.appendChild(t);
document.body.appendChild(s);
})();
とりあえずこれで動きますが、もっとスマートな方法ありそうですね・・・。
JavaScript に対する理解がまだまだ浅いことを実感しました><
参考リンク
- Greasemonkeyで定義した関数をJSONPで呼び出したい - ロックスターになりたい
- JavaScriptの巧い書き方 - Archiva
- amachang - JavaScript 入門
- 関数、オブジェクト、クロージャ - RapidShare
- Greasemonkeyは(function(){\nと\n})()を付加しなくなる(という夢を見た) - 0x廃棄階層 - 統治局
関連する記事
- Newer: 短縮 URL を展開する Greasemonkey
- Older: マク語に変換する bookmarklet
Comments:0
Trackbacks:0
- Trackback URL for this entry
- http://www.sukechan.net/archives/151/trackback/
- Listed below are links to weblogs that reference
- Greasemonkey で JSONP の Callback 関数を呼び出す方法 from sukechan.net

