Rhinoでprotoype.js

30分プログラム、その97。Rhinoprototype.jsを使ってみる。

prototype.jsは、DOMに依存した関数と、DOMに依存していない関数が混ざって入っています。なので、mapとかが使いたいだけでも、DOM関数を用意する必要があります。

John Resig - Bringing the Browser to the ServerRhinoで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より前にセットする必要がある