Como integrar um aplicativo GWT em outro trabalho na web?
-
25-09-2019 - |
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.
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.