2010-04-08 27 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> 

我知道这是不是最好的解决方案,但它只是它的工作到现在为止的方式。

相关问题