2006-08-12 ========== GreaseMonkey で MochiKit 使ってみる。すなわち外部ライブラリの読み込み。あるいははてなのグラフが綺麗じゃない ----------------------------------------------------------------------------------------------------------- Reference URI: http://lowreal.net/logs/2006/08/12/1 Written Time: 2006-08-12T23:54:14+09:00 Tags: web js gm GreaseMonkey で外部ライブラリが使いたいな。みたいな。似たようなのでは [CMS researcher - Greasemonkeyでprototype.jsやscript.aculo.usを使う方法](http://d.hatena.ne.jp/ysano2005/20060127/1138382734) があるのですが、どうもうまくいかなかったので自力実装。 function dll(loadLibs, afterLoadedFunction) { if (afterLoadedFunction._retry) afterLoadedFunction._retry = 0; else afterLoadedFunction._retry+ +; if (afterLoadedFunction._retry > 10) throw("Library is not loaded because o f some reason."); loadLibs.forEach(function (lib) { GM_xmlhttpReque st({ method : "GET", url : lib[0], onload : func tion (req) { try { (function (r) { eval(r.respo nseText) }).call(window, req); } catch (e) { // nigiri tubushi } }, onerror : function (re q) { alert(req.responseText); } }); }); va r loaded = true; loadLibs.forEach(function (lib) { try { loa ded = loaded && typeof eval(lib[1]) != "undefined"; } catch(e) { loaded = false; } }); if (loaded) { try { afterL oadedFunction(); } catch (e) { unsafeWindow.console ? unsafeWin dow.console.log(e) : window.dump(e); } } else { var f = arguments.callee; setTimeout(function () { f.apply (this, [loadLibs, afterLoadedFunction])}, 500); }}で、以下のように使う。 // 第一要素にロードする js への URL// 第二要素にロード確認用のオブジェクトの名前/ / を入れた配列の配列dll([["http://example.com/mochi/Base.js", "MochiKit"]], funct ion () { // ロードされたら実行される})ポイントは eval を使うところ? eval を使うので unsafeWindow を極力使わなくてすむ 。あとは DOM 系の処理でおかしいこと (ここには append できないぜ系エラー) になりに くい気がする。 ロードするスクリプトの依存関係上、何度かリクエストが発射されることがある。めんどい のでブラウザのキャッシュ機能にまかせてこっちではキャッシュしていないけど、ホントは ちゃんとキャッシュしたほうがいいはず。 でもって、はてなアンケートの円グラフを PlotKit で描画しなおす GreaseMonkey スクリ プトを書いてみた。[hatena-q-make-graphs-with-plotkit.user.js](/2006/hatena-q-make-graphs-with-plotkit.user.js) 結果をソートするようにした。あと Global じゃなくて window 使うようにした。 id:secondlife さんからの指摘により、エラーを握りつぶす処理を追加し、最大ロード試行 数を加えました。