2013-07-15 54 views
0

我有一個javascript文件main.js.該main.js包含這樣的事情:GWT:如何確保在構建GWT頁面後運行javascript

$(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的頂部,它停止working:

<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我可以保證 它被稱爲頁面加載中發生的最後一件事情?

非常感謝

回答

3

雖然我覺得奇怪的是腳本不工作打算時,在一個靜態頁面上移($(document).ready(…)應該等待</html> -aka DOMContentLoaded要達到的 - 前運行傳遞給它的函數),這不是它不適用於你的GWT應用程序的原因(換句話說,你的診斷是錯誤的)。

GWT的onModuleLoad也運行在DOMContentLoaded(或更高版本,但從來沒有更早),所以你可能有之間您的應用程序的onModuleLoad和jQuery的$(document).ready(…)的競爭條件。您可以嘗試將<script>用於GWT應用之前的main.js,但由於onModuleLoad無論如何可能會在DOMContentLoader之後運行,因此無法保證它可以正常工作(甚至不用交叉瀏覽器的方式)。

我想你最好刪除main.js或更換$(document).ready(…)用一個簡單的function,並調用Cufon(和/或其他任何你在做$(document).ready(…))從您的GWT應用程序內,在適合您的需要的時刻(即在您將#myform p.head元素/小部件附加到文檔之後)。

最簡單的方法是將腳本放在JSNI方法中,然後在適當的地方調用該方法。只要確保你使用$wnd.Cufon代替Cufon(以及類似的其他所有全局),並與$docwindow$wnd取代的document所有出現。

public static void cufon() /*-{ 
    $wnd.Cufon.replace('#myform p.head', { fontFamily: 'HelveticaNeueLT Std Thin' }); 
}-*/;