マルチファイルのアップロードをサポートするために、 swfupload.jsをGWTプロジェクトに挿入しようとしています。非GWTプロジェクトでローカルに実行されているswfupload.jsのバージョンがありますが、それをGWTプロジェクトに統合するのに問題があります。
<span>
要素がDOMに存在する前にJSが呼び出されているのではないかと思います。jSスクリプトは、アップロードモーダルダイアログが表示されたときに挿入されます。swfupload.js> loadFlash()にブレークポイントを追加し、スパンtargetElement
である必要があるときに未定義として返されることを確認した後です。#btnFileUpload
さらに、<span>
スクリプトがブレークポイントで停止すると、画面に表示されます。
$('#btnFileUpload')
ブレークポイントを使用して、コンソールでクエリを実行すると、が取得されます[]
。$('#btnFileUpload')
ブレークポイントがないと、コンソールでクエリを実行でき<span id="btnFileUpload">...</span>
ます。
GWT / Javaのスクリプトインジェクターコード(私の知る限りでは機能します)
@UiFactory
FormPanel createForm() {
[...]
String baseURL = GWT.getHostPageBaseURL();
ScriptInjector.fromUrl(baseURL + "js/jquery.min.js").inject();
String[] files = {
"swfupload.js",
"handlers.js",
"swfupload.queue.js",
"fileprogress.js",
"swfupload.impl.js"
};
for (String file : files) {
ScriptInjector.fromUrl(baseURL + "js/swfupload/" + file).inject();
}
[...]
}
JavaScript:swfupload.impl.js
var swfu;
$('#btnFileUpload').ready(function() {
var settings = {
button_placeholder_id: "btnFileUpload"
[...]
};
swfu = new SWFUpload(settings);
}
JavaScript:swfupload.js
// Gets called from SWFUpload 'constructor'
SWFUpload.prototype.loadFlash = function () {
var targetElement, tempParent;
[...]
// Get the element where we will be placing the flash movie
targetElement = document.getElementById(this.settings.button_placeholder_id) || this.settings.button_placeholder;
if (targetElement == undefined) {
throw "Could not find the placeholder element: " + this.settings.button_placeholder_id;
}
[...]
};
注:GWTにはSWFUploadが含まれていることは知っていますが、そのルートには行きたくありません。