【问题标题】:GWT inject script element into the html fileGWT 将脚本元素注入到 html 文件中
【发布时间】:2012-01-29 08:39:49
【问题描述】:

在我的 gwt 项目中。我有一个调用字典的脚本:

<script type="text/javascript" src=conf/iw_dictionary.js></script>

而不是在 html 文件中编写此脚本元素。我想在模块加载时从入口点将其注入到 html 中。

我该怎么做?

【问题讨论】:

标签: gwt


【解决方案1】:

使用com.google.gwt.core.client.ScriptInjector,因为它是专门为这样的东西创建的

ScriptInjector.fromUrl("conf/iw_dictionary.js").setCallback(
  new Callback<Void, Exception>() {
     public void onFailure(Exception reason) {
       Window.alert("Script load failed.");
     }
    public void onSuccess(Void result) {
      Window.alert("Script load success.");
     }
  }).inject();

【讨论】:

  • ScriptInjector 类在 GWT_V2.7.0 中可用。如果我必须用 GWT_V.1.x 注入一个 javascript 文件,那么有可能吗?
  • 有可能,但您必须使用以下答案中的解决方案。您可以使用 Dom 提供的答案(但您必须使用较旧的 api 来创建元素)或 Thomas Broyer 答案(我不能 100% 确定它是否适用于 GWT 1.XX)
  • 我正在我的 Web 应用程序中实现 CSRF 防护。我已经完成了所有必需的配置,并且可以看到令牌生成/注入到请求标头中。让我告诉你应用程序的架构,我有 JSP 页面,它使用 Ajax 调用服务来获取数据并在 UI 中显示。我的问题是“我们可以使用 CSRF 保护来保护服务调用吗?”如果可能的话,我该怎么做,因为当我调试执行时它不会进入 CsrfGuardFilter.java 类。感谢您的帮助。
【解决方案2】:

基本上你在 onModuleLoad() 中注入脚本元素:

    Element head = Document.get().getElementsByTagName("head").getItem(0);
    ScriptElement sce = Document.get().createScriptElement();
    sce.setType("text/javascript");
    sce.setSrc("conf/iw_dictionary.js");
    head.appendChild(sce);

注入后浏览器会自动加载。

【讨论】:

  • 对我们这些使用 2.3 的人有用(ScriptInjector 在 2.4 中引入)
  • 我正在我的 Web 应用程序中实现 CSRF 防护。我已经完成了所有必需的配置,并且可以看到令牌生成/注入到请求标头中。让我稍微介绍一下应用程序的架构,我有 JSP 页面,它使用 Ajax 调用服务来获取数据并在 UI 中显示。我的问题是“我们可以使用 CSRF 保护来保护服务调用吗?”如果可能的话,我该怎么做,因为当我调试执行时它不会进入 CsrfGuardFilter.java 类。感谢您的帮助。
【解决方案3】:

您可以简单地添加&lt;script&gt; element in your *.gwt.xml file

<script src='conf/iw_dictionary.js' />

onModuleLoad 只会在脚本加载后被调用(就像您在 html 页面中拥有它一样)。

【讨论】:

  • 据我所知,我必须将&lt;script src='conf/iw_dictionary.js' /&gt; 放入Main.gwt.xml 文件中。我的问题是,这也适用于 gwt V1.XXXX 吗?
  • 是的。但是,从 GWT 2.7 开始,它将不起作用(至少默认情况下),因为默认链接器现在是 xsiframe,它不支持模块文件中的 &lt;script&gt;(然后您必须使用 ScriptInjector 或包含脚本而是在您的 HTML 主机页面中)。
  • 我正在我的 Web 应用程序中实现 CSRF 防护。我已经完成了所有必需的配置,并且可以看到令牌生成/注入到请求标头中。让我告诉你应用程序的架构,我有 JSP 页面,它使用 Ajax 调用服务来获取数据并在 UI 中显示。我的问题是“我们可以使用 CSRF 保护来保护服务调用吗?”如果可能的话,我该怎么做,因为当我调试执行时它不会进入 CsrfGuardFilter.java 类。感谢您的帮助。
【解决方案4】:

jusio、Dom 和 Thomas Broyer 的答案在这里都是有效的。在我的特殊情况下,我希望将一系列 polyfill 脚本注入 GWT,以获得运行原生 JS 代码时所需的一些 IE8 支持。 polyfill 脚本需要可用于 GWT iframe 的窗口上下文 - 而不是主机页面。为此,使用ScriptInjector 是正确的方法,因为它将脚本附加到该级别。您可以使用setWindow(TOP_WINDOW) 使ScriptInjector 将脚本安装到主机窗口。在我的 *.gwt.xml 文件中添加带有 &lt;script&gt; 标记的脚本似乎与使用 @Dom 的方法一样附加到主机窗口。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多