1

我需要从外部 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 片段被执行并将结果(生成的画布)显示在我需要的地方?

谢谢!

4

1 回答 1

0

您最好采用不同的方法,使用 JSNI 仅处理 JavaScript 实现,并将所有更高级别的操作委托给 Java 层。

了解 JSNI 是至关重要的,因此我建议您从深入了解一些文档开始(GWT 的 JSNI 编码基础知识非常有用)。

话虽如此,最好的方法是将库实例化的本机(JavaScript)脚本作为单独的文件,并通过模块(或应用程序)的.gwt.xml文件将其注入预加载。

比您可以将该文件中的代码片段包装在一个自执行块中(即(function() {...})();,作为确保它会在之前运行的手段onModuleLoad(),但这只是调试糖。

于 2012-03-06T19:25:46.637 回答