Rhinoでprotoype.js
30分プログラム、その97。Rhinoでprototype.jsを使ってみる。
prototype.jsは、DOMに依存した関数と、DOMに依存していない関数が混ざって入っています。なので、mapとかが使いたいだけでも、DOM関数を用意する必要があります。
John Resig - Bringing the Browser to the ServerにRhinoでDOM関数を実装したライブラリがあったので、それを使いました。ただ、非同期通信周りで動いていない部分があったので、修正しました。
修正版env.js
http://mzp.sakura.ne.jp/files/env.js
diffも示しておきます。
*** env.js~ 2007-07-17 16:54:14.000000000 +0900 --- env.js 2007-08-01 09:51:07.000000000 +0900 *************** *** 654,662 **** } if (this.async) ! (new java.lang.Thread({ ! run: makeRequest ! })).start(); else makeRequest(); }, --- 654,660 ---- } if (this.async) ! (new java.lang.Thread(makeRequest)).start(); else makeRequest(); },
スレッドの使いかたを間違えているのが原因だとにらんでいます。あとでちゃんと調べて報告を投げます。
ソースコード
load('js/env.js'); window.onload = function(){ // prototype.jsのロードにはこれが必要 document = window.document; navigator.appVersion='1.6(Rhino)'; load('js/prototype.js'); print([1,2,3].map(function(i){ return i*2;})); }; window.location='http://www.kanzaki.com';
注意点
- window.locationの内容のパースはかなり厳格らしい。http://google.comはパースに失敗した
- window.locationはローカルファイルでもいいらしい。試してはいない
- onloadはwindow.locationより前にセットする必要がある