如何将JavaScriptObject结果添加到SmartGWT中生成的HTML的特定位置

How to add a JavaScriptObject result to a particular place of the resulting HTML in SmartGWT?

本文关键字:HTML 位置 定位 SmartGWT JavaScriptObject 结果 添加      更新时间:2023-09-26

我需要从外部Javascript库执行Javascript(我在公共文件夹中留下了与客户端,服务器和共享相同的级别)。我需要该JavaScript的输出(这是由ChemDoodle JavaScript库生成的画布)显示在SmartGWT VLayout中。起初,我尝试将javascript代码添加到HTMLFlow对象,然后将HTMLFlow添加到VLayout,但是HTMLFlow不会执行javascript代码(如果我复制粘贴生成的HTML到另一个浏览器窗口,它可以工作)。我目前正在尝试的是用JSOHelper评估javascript代码。eval("这里的java脚本代码")产生一个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方法做到这一点,但我不知道如何从那里引用vLayout(在javascript中)。知道我们有$doc和$win,但从那里到vLayout(这是在一个选项卡内,这是在其他小部件内),我不知道如何得到。我知道在javascript中有一个getElementByID方法,但我不知道如何获得vLayout的id,然后如何将该DIV(我猜)与绘制的画布关联,以便图像出现在那里。

有没有人能解释我如何管理(我猜通过JSNI是唯一的方法),使javascript代码片段被执行,结果(生成的画布)显示在我需要的地方?

谢谢!

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

了解JSNI是至关重要的,所以我建议您从阅读一些文档开始(GWT关于JSNI的编码基础非常有用)。

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

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