Как интегрировать приложение GWT в другую веб-платформу? - PullRequest
3 голосов
/ 08 апреля 2010

Мне нужна возможность загружать и запускать приложение GWT в любое время в среде Echo2.Мой первый подход состоял в том, чтобы загрузить и выполнить nocache.js в синхронизации клиент-сервер, используя

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

Этот вызов в основном работает, но когда сценарий выполняется, он работает с документом EMPTY вместо текущего документа.приложения Echo2.Должен ли сначала быть инициализирован какой-либо сценарий или требуется какое-либо событие?

Приложение / сценарий GWT работает нормально, если оно включено в стартовый HTML-код приложения, поэтому я предполагаю, что приложение GWT будет правильным,Оригинальный автономный HTML-код приложения GWT также содержит тег HTML-сценария в теле.

1 Ответ

1 голос
/ 09 апреля 2010

Проблема в том, что вызовы dowcument.write в файле nocache.js работают, только если документы не закончили загрузку.В противном случае document.write перезапишет весь документ.

Для этого вызовы document.write необходимо заменить методами createElement из DOM:

Для первого кода, который добавляет скрипт с маркером.id:

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

Для второй части (почти в конце nocache.js).Замените «app» на имя вашего приложения:

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> 

Я знаю, что это не лучшее решение, но это единственный способ, которым он работал до сих пор.

...