繁体   English   中英

GWT和JSNI:第三方库集成

[英]GWT and JSNI: third-party library integration

我正在尝试将Opentip集成到GWT项目中。 由于我的某些小部件是从Java而不是HTML加载的,因此我似乎不得不使用JSNI来正确绑定那些工具提示。 到目前为止,这是我所做的:

  1. 将相关的JS / CSS声明放在HTML文件中GWT的nocache.js之前。 (我还尝试使用ScriptInjector复制JS加载,但这没有任何用处,因此我将其删除为多余的。
  2. 编写了JSNI方法来实例化工具提示:

     private native void initControlTooltips() /*-{ var headerText = "Tooltip text"; new $wnd.Opentip($("#tooltipTrigger"), headerText); // more tooltips... }-*/ 

我尝试了上述方法的不同变体,但是我已经读到了这是应该起作用的方式( 此处是幻灯片20,尽管我不能直接链接到幻灯片)。 到目前为止,我还没有运气,最近一次的尝试(对我来说似乎是最正确的)实际上已经阻止了我的GWT模块其余部分的加载(在工具提示实例化调用之后),好像我的某个语法错误,尽管控制台没有报告任何内容。 关于我在做什么错的任何想法吗? 我对GWT和JS都比较陌生,所以我希望这只是一个愚蠢的初学者的错误。

我还没有尝试过的一件事是编写一个Overlay对象 ,部分原因是我从文档中看不到如何正确包装JS构造函数。 如果这是解决方案,那么欢迎提供一些有关如何执行此操作的指示。 作为参考,我将使用的构造函数(来自Opentip文档)是:

new Opentip("#my-trigger-element", "Optional content", "Optional title", { ...options... });

谢谢你的帮助; 这似乎不应该是一个棘手的问题,但是到目前为止,我的经验不足挫败了我的努力。

更新资料

经过数小时的咒骂和参数摆弄,我已经解决了这个问题,所以不要浪费任何时间尝试帮助我进行调试。 我会在稍晚的空闲时间写一个答案。

这样就完成了web.gwt.xml ,模块和EntryPoint设置。 如果您没有这些东西,那么这不是您的答案。 该文档不是一个不好的起点。 这个答案将以Opentip为例,但是我不明白为什么它对其他人也无效。 但是,特别是,如果您仅在GWT中设置了小部件(无法从HTML进行访问),并且需要将外部JS绑定到它们以启用某些功能,则适用于这种情况。

  1. 破解您的web.gwt.xml ,并确保在要使用它的模块的条目中包含库的源代码。 这意味着,如果您也不特别需要在页面的静态HTML中声明它,则无需在页面的静态HTML中声明它。

     <script src="../js/opentip/opentip-jquery.min.js"/> 

    (请注意../这是GWT生成的HTML文件最终在服务器上的相对路径,必须由Web服务器访问。)

  2. 在要使用该库的模块类中,装配一个JSNI方法,如下所示调用您的库构造函数:

     private native void initTooltip() /*-{ new $wnd.Opentip($doc.getElementById("tooltipTrigger"), "Tooltip text"); }-*/; 

    (请注意, $wnd用于引用顶级窗口, $doc用于引用文档。在$wnd. wnd之前$wnd.用于引用在外部JS文件中声明/分配的任何全局变量。)

不需要花哨的Overlay类型或ScriptInjector调用。 我也有一个问题,其他工作时这一点-我调用getElementById()回来了null -这竟然是因为我打电话给我的JSNI方法之前在相关对象已被添加到DOM onModuleLoad()

就像我最初认为的那样,这原来是一个简单的初学者的错误。 希望这可以帮助其他试图将对类似问题的其他答案组合在一起的人,以解决他们的问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM