0

我有一个 javascript 文件 main.js。main.js 包含如下内容:

$(document).ready(function() {
     Cufon.replace('#myform p.head', { fontFamily: 'HelveticaNeueLT Std Thin' });
     ......
});

我想这样做是在加载整个页面后运行此方法并将更改应用于 css 元素。

但我发现这仅在脚本在所有 HTML 元素之前加载时才有效,例如:

 <body>
   HTML......
   <script type="text/javascript" src="js/main.js"></script>
 </body>

但是,如果将此脚本放在所有 HTML 之上,它将停止工作:

 <body>
   <script type="text/javascript" src="js/main.js"></script>
   HTML......
 </body>

这发生在静态 HTML 和 GWT 页面上。因为我的 GWT 总是将生成的 HTML 内容放在所有正文内容的末尾,所以脚本总是在 HTML 之前,因此不起作用。例如,我的 GWT 模块的 HTML 是这样的:

  <body>
       <script type="text/javascript" src="js/main.js"></script>
  </body>

编译后,从我的 UIBinding 生成的 HTML 会给出如下 HTML 页面:

  <body>
       <script type="text/javascript" src="js/main.js"></script>
       Generated HTML....
  </body>

我的问题是:

  1. 无论如何,在 GWT 中我可以指定生成的 HTML 位于标记中的某些语句之间。
  2. 有没有其他方法可以代替 $(document).ready 我可以保证它被称为页面加载中发生的最后一件事?

非常感谢

4

1 回答 1

3

虽然我觉得奇怪的是脚本在静态页面中向上移动时无法按预期工作($(document).ready(…)应该等待</html>到达 - aka DOMContentLoaded- 在运行传递给它的函数之前),但这不是它没有的原因' t 与您的 GWT 应用程序一起工作(换句话说,您的诊断错误)。

GWTonModuleLoad也在DOMContentLoaded(或以后,但绝不会更早)运行,因此您的应用程序onModuleLoad和 jQuery之间可能存在竞争条件$(document).ready(…)。您可以尝试将您的<script>GWT应用程序main.jsonModuleLoadDOMContentLoader

我认为您最好在适合您需要的时刻(即在您附加元素/小部件之后)从您的 GWT 应用程序中删除main.js或替换$(document).ready(…)一个简单的function, 并调用Cufon(和/或您在到文件)。$(document).ready(…)#myform p.head

最简单的方法是将脚本放入 JSNI 方法中,然后在适当的地方调用该方法。只需确保使用$wnd.Cufon而不是Cufon(对于所有其他globals也是如此),并替换所有出现的documentwith$docwindowwith $wnd

public static void cufon() /*-{
  $wnd.Cufon.replace('#myform p.head', { fontFamily: 'HelveticaNeueLT Std Thin' });
}-*/;
于 2013-07-15T10:52:56.043 回答