2011-10-17 11 views
1

外部のjavascriptライブラリ(クライアント、サーバー、共有と同じレベルのパブリックフォルダに残したもの)からJavascriptを実行する必要があります。 SmartGWT VLayout内にそのJavaScript(ChemDoodle javascriptライブラリで生成されたCanvas)の出力が表示されている必要があります。最初は、HTMLFlowオブジェクトにjavascriptコードを追加し、HTMLFlowをVLayoutに追加しようとしましたが、HTMLFlowはJavascriptコードを実行しません(生成されたHTMLを別のブラウザウィンドウにコピー&ペーストすれば動作します)。私が現在取り組んでいるのはJSOHelper.eval( "java script code here")を使ってjavascriptコードを評価してJavaScriptObjectを得ることです。しかし、私はどのようにVLayoutの内部でjavascript実行の結果を "配置"するのか分かりません。私が言ったようにHTMLFlow>は、スクリプト\>ブロック(ブール設定setEvalScriptBlocks(真)のみHTMLFlowから呼び出された他のURLに適用される)を実行しないのでSmartGWTの結果HTMLの特定の場所にJavaScriptObject結果を追加するにはどうすればよいですか?

String javaScriptCode = 
"var viewerCanvas = new ChemDoodle.ViewerCanvas('viewerCanvas', 200, 200);\n" + 
"var molFile = 'contentToBeDrawnByChemDoodleCanvas';\n" + 
"var moleculeToShow = ChemDoodle.readMOL(molFile);\n" + 
"viewerCanvas.loadMolecule(moleculeToShow);\n"; 

HTMLFlow hflow = new HTMLFlow("<script>\n"+javaScriptCode+"</script>"); 
vLayout.addMember(hflow); 

しかし、これは動作しません。だから、あなたが行うことができますJSOHelperクラスで:

JavaScriptObject jso = JSOHelper.eval(javaScriptCode); // without the <script> tags 
// but the following line doesn't work, probably because jso is not a HTMLFlow 
HTMLFlow flow2 = HTMLFlow.getOrCreateRef(jso); 
// so then this doesn't work either, but I guess it shows where I want to get. 
vLayout.addMember(flow2); 

JavaScriptで(私はJSNI方法でそれを行う方法を理解しようとしてきたが、私はそこからvLayoutを参照する方法がわかりません)。私たちが$ docと$ winを持っていることを知っていますが、そこからvLayout(他のウィジェットの中にあるタブの中にあります)には、どうやって取得するのか分かりません。私はjavascriptにgetElementByIDメソッドがあることを知っていますが、vLayoutのIDを取得する方法と描画されたキャンバスにそのDIV(私が推測する)を関連付ける方法がわからないので、イメージがそこに表示されます。

javascriptスニペットが実行され、結果(生成されたキャンバス)が必要な場所に表示されるようにするには、どのように(私はJSNIを通して唯一の方法だと思いますか)

ありがとうございます!

答えて

0

JSNIを使用してJavaScriptの実装のみを処理し、すべての上位レベルの操作をJavaレイヤーに委任するのは別の方法です。

JSNIを知ることは非常に重要です。まず、いくつかのドキュメントに入り込むことから始めてください(GWT's coding basics on JSNIは非常に便利です)。

ライブラリのインスタンシエーション用のネイティブ(JavaScript)スクリプトを別のファイルとして用意し、モジュール(またはアプリケーション)の.gwt.xmlファイルを介してプリロードするようにするのが最適な方法です。あなたは(自己実行ブロックに、そのファイルの中にそれがonModuleLoad()する前に実行されることを確認することの手段として、すなわち(function() {...})();をコードスニペットをラップすることができますが、これは単なる砂糖をデバッグされているよりも

関連する問題