2010-12-14 4 views
5

GWTリンカーでdocument.write()を使用しているため、DOMにスクリプトタグを追加するだけでGWTアプリケーションをロードしたいだけですそう。私は様々なブログ投稿でこれを行うためのいくつかのハックを見つけましたが、それらはすべてGWTの最新バージョンで失敗するようです。これを行うための合理的に非侵襲的なアプローチが思い浮かぶでしょうか?GWT bookmarketまたは外部ライブラリとしてのGWT

明確化:あなたのホストのhtmlページで、GWTアプリを起動する

通常の方法:

<script type="text/javascript" language="javascript" src="myapp.nocache.js"></script> 

これは、当然のことながら、ページが読み込まれるとすぐに起動します。私は後でそれをやりたい:

function startapp() { 
    var head = document.getElementsByTagName('head'); 
    var s = document.createElement('script'); 
    s.setAttribute('type', 'text/javascript'); 
    s.setAttribute('src', 'myapp.nocache.js'); 
    head[0].appendChild(s); 
} 
+0

今、あなたのブックマークレットは、次のようになります。例が役に立ちます。 – Amey

+0

@Amey checkout上記のアップデート。ありがとう! –

+0

あなたのコードスニペットは、あなたのサイトでそれを実行している限り動作するはずです。 'nocache.js'は、遅延バインディングに基づいて必要に応じて' cache.html'ファイルをロードし、おそらく絶対URLを使用しません。 –

答えて

5

は、これまで動作するように思われるものです:

はあなたのApp.gwt.xmlの先頭にこれを追加:上記の設定を使用してアプリケーションをコンパイルした後

<!-- Cross site linker --> 
<inherits name="com.google.gwt.core.Core" /> 
<add-linker name="xs" /> 

、修正(またはコピー)生成されたapp.nocache.js次のように:

1)は、最後の文$doc.write...

2)$doc.write駅からこの部分をコピーコメントあなたはちょうどコメントし、それを評価してください。例:

eval('window.__gwtStatsEvent && window.__gwtStatsEvent({' + 'moduleName:"app", sessionId:window.__gwtStatsSessionId, subSystem:"startup",' + 'evtGroup: "loadExternalRefs", millis:(new Date()).getTime(),' + 'type: "end"});' + 'window.__gwtStatsEvent && window.__gwtStatsEvent({' + 'moduleName:"app", sessionId:window.__gwtStatsSessionId, subSystem:"startup",' + 'evtGroup: "moduleStartup", millis:(new Date()).getTime(),' + 'type: "moduleRequested"});'); 

3)この行を直後に追加します。

document.body.appendChild(document.createElement('script')).src=base + strongName + ".cache.js"; 

したがって、基本的に$doc.writeをその2行に置き換えています。私は非常に申し訳ありませんが、あなたは言い換えてください可能性

<a href="javascript:(function(){document.body.appendChild(document.createElement('script')).src='http://abc.com/app.nocache.js';})();">My App</a> 
+0

アップデート:xsiframeリンカを代わりに使うだけで、これをすべて避けることができます。 –

+0

優秀な質問とディスカッションアブドッラー!私はあなたとまったく同じことをやろうとしており、ブックマークレットからJSを生成したGWTを追加します。あなたが言及したxsiframeリンカへのポインタを私に与えることができますか?上記の文書化されたあなたの解決策を試してみてください。ありがとう! –

+0

xsiframeリンカのコードは次のとおりです。http://code.google.com/p/google-web-toolkit/source/browse/trunk/dev/core/src/com/google/gwt/core/linker/CrossSiteIframeLinker .java?r = 9161 –

0

ブラウザのJavaScriptファイルをロードするたびに、そのまた、あなたのケースではなど

をシンボルテーブルを構築するためにinorderを、それのすべての行を実行し、アプリブラウザにロードされ、domがロードされた後、GWTモジュールjsがロードされます。この時点で、ブラウザはGWTモジュールのjavascriptのすべての行を実行しようとします。これにより、以前ロードされたDOMがtossのために移動する可能性があります。

あなたのユースケースはなんですか?あなたの条件は、条件付きでGWTモジュールをロードしている場合、あなたはこのような何かを試みることができる: はあなたの頭の中で、これを含める:ここ

<script src="gwtmoduleloader.js"></script> 

gwtmoduleloader.jsはGWTモジュールがあるかどうかを把握するためのロジックを保持するInfactはサーブレットですロードされる。

GWTモジュールがロードされる場合は、sevletは

document.write('<script src="myapp.nocache.js"></script>') 

か、他が静かに戻る印刷することができます。

ブラウザがgwtmoduleloader.jsの内容を評価すると、別のスクリプト(あなたの場合はgwtモジュール)のdocument.writeが読み込まれ、評価されます。したがって、これは条件付きの荷重であり、ボディがローディングを開始する前に達成することができます。

この商品をお求めの客様はこんな商品もお求めです。

+0

どのくらい私は私の質問を明確にすることができるかわからない、あなたはブックマークレットが何であるか理解していますか?ページがすでに読み込まれた後、あなたのページにJavaScriptが挿入されます。例:このスタックオーバーフローページで、私は読んで見て回っています、そして今、私はブックマークレットを実行したいと思っています。私はページにjavascriptを注入する必要があります。 GWTのローダーは動作しません。なぜなら、onloadイベントが起こっていて、ずっと前になってしまってdocument.write()は動作しなくなるからです。 –

1

私はすでにクロスドメインリンカーを使用していると仮定していますが、これはdocument.writeの問題を解決しません。そうでない場合、一見の価値(言うべきことで申し訳ありませんが、十分ではない経験。)であるかもしれない、私はかなり確信して

一つのアプローチは、動作させることができ、このです:

あなたのブックマークレットは、スクリプトタグを追加しますページへ(現在)

このスクリプトはGWTコンパイラの出力ではありません。これは、ページにIFrameを追加する普通のJavaScriptです。そのIFrameのsrcは、GWTモジュールをロードするサーバーのHTMLページをポイントします。

あなたのGWTモジュールがロードされたページから物事を取り出すことが目標です。もちろん、IFrameは親ページとは別のドメインから来るため、この場合は直接行うことはできません。

この作業を行うには、ウィンドウを使用する必要があります。postMessageとwindow.addEventListenerを使用して、IFrameのGWTモジュールと親のJavaScriptスタブ(GWT側のJSNIを使用)を通信します。

古いブラウザをサポートする必要がある場合、postMessageは機能しませんハッシュ操作で逃げることができるかもしれない - しかし、これはおそらく私が実用性についての線を描くところだろう。ここで

+0

良いコメントありがとうございます。私は実際に(私はxsリンカーを使用していた)動作するように見えるソリューションを考え出しました。私は基本的に、生成された.nocache.js内のいくつかの行を置き換えて、doc.writeの代わりにスクリプトタグを動的に挿入しました。私はこれが動作すると確信する前にもう少しそれをテストするつもりです... –

+0

素晴らしい。この問題に対する正しい解決策は、適切なことをするGWTリンカーを書くことですが、その能力はまだ未来のようです。 –

関連する問題