我需要從外部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代碼段被執行,結果(生成的畫布)顯示在我需要的地方?
謝謝!