将Javascript代码插入ScriptElement以设置Window vars

时间:2013-10-03 17:41:42

标签: java javascript gwt

在GWT中如何将此Javascript变为ScriptElement:

<script type="text/javascript">
var addthis_config = addthis_config||{};
addthis_config.pubid = 'YOUR-PUBID';
$.getScript( "https://s7.addthis.com/js/300/addthis_widget.js#domready=1");
</script>

我所知道的解决方案是:

  ScriptElement script = doc.createScriptElement();
  script.setSrc("https://s7.addthis.com/js/300/addthis_widget.js#domready=1");

然而,addthis_configaddthis_config.pubid

怎么样?

1 个答案:

答案 0 :(得分:2)

创建ScriptElement后,您必须将其注入DOM以加载第三方脚本,但这不是在GWT中加载脚本的常规方法。

通常在GWT中我们使用ScriptInjector,但在您的情况下,您必须使用以前的一些JSNI代码在窗口对象中设置这些变量:

final static String AT_PUBID = "YOUR-PUBID";
final static String AT_URL = "https://s7.addthis.com/js/300/addthis_widget.js#domready=1";

public void onModuleLoad() {
  setAddthisId(AT_PUBID);
  ScriptInjector.fromUrl(AT_URL).inject();
}

private static native void setAddthisId(String id) /*-{
  $wnd.addthis_config = $wnd.addthis_config||{};
  $wnd.addthis_config.pubid = id;
}-*/;

你甚至可以使用ScriptInjector将你的javascript代码注入一个字符串,但IMO这是一个讨厌的解决方案,因为GWT编译器无法执行任何JSNI语法检查:

....
ScriptInjector.fromString(
   "$wnd.addthis_config = $wnd.addthis_config||{};" +
   "$wnd.addthis_config.pubid = '+ " AT_PUBID + "';"
).inject();
ScriptInjector.fromUrl(AT_URL).inject();

如果你真的不想使用JSNI来避免处理javascript错误,我建议你使用gwtquery库,除了几十个功能之外你还可以使用它来操作DOM元素一个非常简单的语法:

import static com.google.gwt.query.client.GQuery.*;
....

$(window).prop("addthis_config", $$("pubid: " + AT_PUBID));
ScriptInjector.fromUrl(AT_URL).inject();