2011-10-17 55 views
1

我需要從外部JavaScript庫(我留在與客戶端,服務器和共享級別相同的公用文件夾中)執行Javascript。我需要在SmartGWT VLayout中顯示該JavaScript(它是由ChemDoodle JavaScript庫生成的Canvas)的輸出。起初,我嘗試將JavaScript代碼添加到HTMLFlow對象,然後將HTMLFlow添加到VLayout,但是HTMLFlow將不會執行Javascript代碼(如果我將製作的HTML複製粘貼到另一個瀏覽器窗口中,它將起作用)。我目前正在嘗試的是使用JSOHelper.eval(「這裏是java腳本代碼」)來評估JavaScript代碼,從而產生一個JavaScriptObject。但是我不知道如何將JavaScript執行的結果「放置」到VLayout中。如何將JavaScriptObject結果添加到SmartGWT中生成的HTML的特定位置?

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); 

然而,正如我所說,這並不工作,因爲HTMLFlow將不執行>腳本\>塊(布爾設置setEvalScriptBlocks(真)僅適用於從HTMLFlow調用其它URL)。所以,用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); 

我一直在試圖找出如何使用JSNI方法做到這一點,但我不知道如何從那裏指vLayout(在JavaScript )。知道我們有$ doc和$ win,但是從那裏到vLayout(它位於其他小部件內部的選項卡內),我不知道如何獲取。我知道JavaScript中有一個getElementByID方法,但我不知道如何獲取vLayout的id,然後如何將DIV(我猜)與繪製的畫布相關聯,以便圖像顯示在那裏。

任何人都可以解釋我如何管理(我猜是通過JSNI是唯一的方法),使該JavaScript代碼段被執行,結果(生成的畫布)顯示在我需要的地方?

謝謝!

回答

0

您最好採取不同的方法,使用JSNI僅處理JavaScript實現,並將所有更高級別的操作委託給Java層。

瞭解JSNI是至關重要的,所以我建議你先從一些文檔入手(GWT's coding basics on JSNI非常有用)。

說了這樣的話,最好的方法是將庫實例化的本地(JavaScript)腳本作爲單獨的文件,並通過模塊(或應用程序)的.gwt.xml文件進行預加載。

比你可以在自執行塊文件中包裹的代碼段(即(function() {...})();爲確保它會之前onModuleLoad()運行的手段,但是這僅僅是調試糖。

相關問題