我需要从外部 javascript 库中执行 Javascript(我将其留在公用文件夹中,与客户端、服务器和共享文件夹处于同一级别)。我需要在 SmartGWT VLayout 中显示该 JavaScript(它是由 ChemDoodle javascript 库生成的 Canvas)的输出。起初我尝试将 javascript 代码添加到 HTMLFlow 对象,然后将 HTMLFlow 添加到 VLayout,但是 HTMLFlow 不会执行 Javascript 代码(如果我将生成的 HTML 复制粘贴到另一个浏览器窗口中,它可以工作)。我目前正在尝试使用 JSOHelper.eval("java script code here") 评估 JavaScript 代码,从而生成 JavaScriptObject。但是我不知道如何将 javascript 执行的结果“放置”在 VLayout 中。
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 不会执行 >script\> 块(布尔设置 setEvalScriptBlocks(true) 仅适用于从 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 方法来做到这一点,但我不知道如何从那里(在 javascript 中)引用 vLayout。知道我们有 $doc 和 $win,但是从那里到 vLayout(在选项卡内,在其他小部件内),我不知道如何获取。我知道 javascript 中有一个 getElementByID 方法,但我不知道如何获取 vLayout 的 id,然后如何将该 DIV(我猜)与绘制的画布相关联,以便图像出现在那里。
谁能解释我如何管理(我想通过 JSNI 是唯一的方法)以使该 javascript 片段被执行并将结果(生成的画布)显示在我需要的地方?
谢谢!