2010-04-08 57 views
3

我需要能夠隨時在Echo2環境中加載和啓動GWT應用程序。我的第一個方法是加載和使用如何將GWT應用程序集成到另一個Web框架中?

var script = document.createElement("script"); 
script.setAttribute("src",javascriptURI); 
script.setAttribute("type","text/javascript"); 
document.getElementsByTagName('body')[0].appendChild(script); 

這個調用基本上執行工作在客戶機 - 服務器同步的nocache.js,但在執行腳本時,它在一個空文件,而不是當前文檔操作Echo2應用程序。腳本是否首先被初始化或者是否有任何事件需要?

如果GWT應用程序/腳本包含在應用程序的啓動HTML中,它可以正常工作,所以我假設GWT應用程序是正確的。 GWT App的原始獨立HTML在主體中也有HTML腳本標記。

+0

根據應用程序的作用以及您希望如何與Echo2環境交互,您可以將GWT應用程序加載到「iframe」中。 – 2010-04-08 23:15:28

回答

1

問題是,nocache.js文件中的dowcument.write調用僅在文檔尚未完成加載時才起作用。否則,document.write將覆蓋整個文檔。

對於與標記ID添加腳本第一代碼:

var script = document.createElement("script"); 
script.setAttribute("id", markerId); 
$doc_0.getElementsByTagName("body")[0].appendChild(script); 

對於第二部分(

THEREFOR執行document.write呼叫必須由DOM的方法的createElement被替換幾乎在nocache.js的末尾)。與應用程序名稱替換了「應用程序」:

try { 
    var script = document.createElement("script"); 
    script.setAttribute("defer", "defer"); 
    script.innerHTML = "app.onInjectionDone('app')"; 
    $doc_0.getElementsByTagName("body")[0].appendChild(script); 
} catch (e) { 
    // Fallback if we want to use the original html page without embedding in IE 
    $doc_0.write('<script defer="defer">app.onInjectionDone(\'app\')<\/script>'); 
} 

所以,這是已經在GWT生成的代碼要修補的部分。 現在html頁面加載和啓動應用程序,當用戶點擊該按鈕:

<html> 
    <head> 
    <!-- base url --> 
    <base href="http://localhost:8080/app/" /> 
    <meta http-equiv="content-type" content="text/html; charset=UTF-8"> 
    <link type="text/css" rel="stylesheet" href="static-gwt.css"> 
    <title>APP</title> 
    <script type="text/javascript"> 

    function startApp() { 
     if (document.createElement && document.getElementsByTagName) { 
      var script = document.createElement('script'); 
      script.type = 'text/javascript'; 
      script.src = 'app/app.nocache.js'; 
      var heads =document.getElementsByTagName('body'); 
      if (heads && heads[0]) { 
      heads[0].appendChild(script); 
      triggerAppStart(); 
      } 
     } 
    } 

    function triggerAppStart(){ 
     try{ 
     app.onInjectionDone('app'); 
     if (!document.createEventObject) { 
      var evt = document.createEvent("HTMLEvents"); 
      evt.initEvent("DOMContentLoaded", true, true); 
      document.dispatchEvent(evt); 
      } 
     } catch (e) { 
     window.setTimeout('triggerAppStart()', 100); 
     } 
    } 

</script> 
    </head> 
    <body> 
    <input type="button" onclick="startApp();return false;"> 
    </body> 
</html> 

我知道這是不是最好的解決方案,但它只是它的工作到現在爲止的方式。

相關問題