2010-04-08 7 views
3

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

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

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

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

+0

В зависимости от того, что приложение делает и как вы хотите, чтобы оно взаимодействовало с вашей средой Echo2, вы могли просто загрузить приложение GWT в 'iframe'. –

ответ

1

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

Therefor на document.write вызовов должен быть заменены методами createElement РВА:

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

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

Для второй части (почти в конце 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> 

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

Смежные вопросы