0

私の要件は、「送信」ボタンをクリックすることです -

  1. HTML ページの "< li >" 要素をループし、各 "< li >" 要素から objectURL を取得し、イメージを Canvas にロードして、そこから dataURL を取得します。これらの dataURL を HTML ページの非表示フィールドに格納します。
  2. 次に、隠しフィールドから dataURL を取得し、それらをバイト配列に変換して、さらに処理を進めます。

私は以下の方法を達成することを目指しました...

1.YUI3 Java スクリプト (submitBehavior_js.js) を使用して最初の部分を実現します。使用 (「クリック」イベント)

submitButton.add(new submitBehavior_js('click',parameters));

2.「送信」ボタンの onSubmit() メソッドをオーバーライドして、2 番目の部分を実現します。

onSubmit(target,form)
{
String[] imgArray = null;
imgdata = hiddenImageData.getValue();
imgArray = imgData.split(',');
.........
}

私はいくつかのスレッドを経験しましたが、実際の経験では、submitBehavior_js.js の前に onSubmit() Java コードが呼び出されるため、隠しフィールドには画像データがありませんでした。

そこで、「クリック」の代わりに「マウスアップ」イベントを使用して Java スクリプトを呼び出そうとしました。これは完全に正常に機能しており、ウィケット コントローラーの onSubmit() の前に Java スクリプトが実行されています。

ただし、私のコードはアダプティブ Web であり、モバイル プラットフォームのブラウザー間で動作するはずです。どうやら「マウスアップ」は私の助けにはなりませんでした。YUI3 のドキュメントで提案されているように、「touchend」イベントと「gesturemoveend」イベントを使用しようとしましたが、どちらの場合も onSubmit() ウィケット Java コードが JavaScript の前に実行されます。

次に、以下のようにjavascriptを呼び出そうとしました:

onSubmit(target, form)
{
target.appendJavaScript("new submitBehavior_js('click',<<parameters>>)");
System.out.println("Inside Submit method in wicket");
String[] imgArray = null;
imgdata = hiddenImageData.getValue();
imgArray = imgData.split(',');    
.........
}

上記のコードでは、コントロールは Wicket コントローラーから Java スクリプトに渡されますが、Canvas 要素の onLoad() を実行する前に Java コードに戻ります。ここに私の Java スクリプト スニペットがあります... myCanvas は HTML の隠し要素です(style=display:none)

alert("Start here");
var imgArray[];
var lineCtr = 0;

for each LI List item (Say I have 2 items)
{
var imageObjectURL = node.get('children').getAttribute('href')
image = new Image()
image.onLoad = function() {

alert("Inside onload of image to canvas");
var canvas = document.getElementById("#myCanvas");
var ctx = canvas.getContext('2d');
ctx.fillRectangle('white');
ctx.drawImage(image,700,600,0,0);
var data  = ctx.toDataUrl();

imgArray[lineCtr] = data;
Y.one("#hiddenImageData").setAttribute('value',imgArray);
lineCtr = lineCtr + 1;
alert("finished here");

}

image.src = imageObjectURL;
alert("after assigning object URL. Completed List item");
}

表示・アラートの順番は以下の通りです。

alert - Start here 
alert - after assigning object URL. Completed List item 
alert - after assigning object URL. Completed List item 
JAVA Sysout  - Inside Submit method in wicket 
alert - Inside onload of image to canvas 
alert - finished here 
alert - Inside onload of image to canvas 
alert - finished here

Canvas 要素のロード時は Java コードの後に​​実行されるため、明らかに非表示の画像データ変数には null 値が含まれています....そして、ユーザーがキャプチャ/アップロードした画像を失っています。この奇妙な動作の理由は何ですか? または私の理解が間違っている可能性がありますか?また、私の仕事を達成するためのより良い方法。あなたの時間を感謝し、助けてください!!

4

1 に答える 1