Pergunta

Preciso da capacidade de carregar e iniciar um aplicativo GWT a qualquer momento em um ambiente Echo2. Minha primeira abordagem foi carregar e executar o nocache.js em uma sincronização cliente-servidor usando

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

Essa chamada funciona basicamente, mas quando o script é executado, ele opera em um documento vazio, em vez do documento atual do aplicativo Echo2. De alguma forma, o script deve ser inicializado primeiro ou é necessário algum evento?

O aplicativo/script GWT funciona bem se estiver incluído no HTML inicial do aplicativo, então presumo que o aplicativo GWT esteja correto. O HTML independente original do aplicativo GWT também possui a etiqueta de script HTML no corpo.

Foi útil?

Solução

O problema é que o escrito dowCument.Write chama o arquivo nocache.js funciona apenas se os documentos não tiveram o término do carregamento. Caso contrário, o Document.Write substituirá todo o documento.

Portanto, as chamadas Document.Write devem ser substituídas pelos métodos CreateElement de DOM:

Para o primeiro código que adiciona o script ao ID do marcador:

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

Para a segunda parte (quase no final do nocache.js). Substitua o "aplicativo" pelo nome do seu aplicativo:

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>');
}

Então, essa foi a parte que deve ser corrigida no código gerado por GWT. Agora, a página HTML que carrega e inicia o aplicativo quando o usuário clica no botão:

<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> 

Eu sei que essa não é a melhor solução, mas é a única maneira de funcionar até agora.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top