Frage

ich brauche die Fähigkeit, eine GWT App jederzeit in einer Echo2 Umgebung zu laden und zu starten. Mein erster Ansatz war zu laden und die nocache.js in einem Client-Server-Sync mit

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

Dieser Aufruf funktioniert im Prinzip, aber wenn das Skript ausgeführt wird, es arbeitet auf einem leeren Dokument anstelle des aktuellen Dokuments der Echo2 Anwendung. Hat das Skript irgendwie zuerst initialisiert werden oder gibt es eine Veranstaltung erforderlich?

Die GWT-Anwendung / script funktioniert gut, wenn es in der Start-up-HTML-Code der Anwendung enthalten ist, so dass ich die GWT App übernehmen richtig. Der ursprüngliche Standalone-HTML-Code der GWT App hat den HTML-Script-Tag in dem Körper als auch.

War es hilfreich?

Lösung

Das Problem ist, dass die dowcument.write Anrufe in der nocache.js Datei funktioniert nur, wenn die Dokumente nicht fertig geladen hat. Sonst wird document.write das gesamte Dokument überschrieben.

Dazu werden die document.write Anrufe wurden durch die create Methoden der DOM ersetzt werden:

Für den ersten Code, der das Skript mit der Marker-ID ergänzt:

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

Für den zweiten Teil (fast am Ende des nocache.js). Ersetzen Sie die „App“ mit Ihrem Anwendungsname:

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

So, dass der Teil war, die in der gwt generierten Code gepatcht werden muss. Nun ist die HTML-Seite, die geladen und startet die Anwendung, wenn der Benutzer auf die Schaltfläche klickt:

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

Ich weiß, dass dies nicht die beste Lösung, aber es ist der einzige Weg, um es bis jetzt gearbeitet.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top