Вызов сценария YUI3 перед onSubmit() кнопки на Wicket Framework

Мое требование - нажать кнопку «Отправить» -

  1. прокручивать элементы «‹ li >» на HTML-странице, получать URL-адрес объекта из каждого элемента «‹ li >», загружать изображение на холст и получать от него URL-адрес данных. Сохраните эти URL-адреса данных внутри скрытого поля на HTML-странице.
  2. Затем извлеките URL-адреса данных из скрытых полей, преобразуйте их в массив байтов и продолжите дальнейшую обработку.

Я стремился достичь нижеследующего пути...

1. Использование java-скрипта YUI3 (submitBehavior_js.js) для достижения первой части. Используется (событие «клик»)

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

2.Переопределение метода onSubmit() кнопки «Отправить» для достижения второй части.

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

Я прошел через несколько потоков, и с моим практическим опытом java-код onSubmit() вызывается до submitBehavior_js.js, поэтому в скрытых полях не было данных изображения.

Итак, я попытался вызвать java-скрипт, используя событие «mouseup» вместо «щелчка». Это работало отлично, и java-скрипт запускается перед onSubmit() на контроллере калитки.

Однако мой код — это адаптивный веб, и он должен работать в браузерах на мобильных платформах. Очевидно, "mouseup" не пришел мне на помощь. Я пытался использовать события «touchend» и «gesturemoveend», как это предлагается в документации YUI3, но в обоих случаях код java калитки onSubmit() выполняется перед 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(',');    
.........
}

С приведенным выше фрагментом кода управление переходит к java-скрипту от контроллера Wicket, но возвращается к java-коду перед выполнением onLoad() элемента Canvas. Вот мой фрагмент 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-кода, очевидно, скрытая переменная данных изображения имеет нулевые значения... и я теряю захваченные/загруженные изображения пользователем. Есть ли причина такого странного поведения? или может быть мое понимание неправильно? Кроме того, лучший способ выполнить мою задачу. Цените свое время и помогите!!


person akella suresh kumar    schedule 01.11.2013    source источник


Ответы (1)


Сделайте свой JavaScript, который вы хотите сделать, в IAjaxCallListener, как я показал в этом ответе. Таким образом, вы убедитесь, что он выполняется до того, как будет выполнен вход onSubmit().

person Robert Niestroj    schedule 01.11.2013
comment
Спасибо, Робер Нистрой. По вашей ссылке для ответа я не смог использовать IAjaxCallListener, поскольку мы используем калитку 1.4.8. Но я смог использовать getAjaxCallDecorator. Однако результат тот же. Хотя java-скрипт выполняется первым, onLoad элемента Canvas выполняется после метода onSubmit() кнопки. Не совсем уверен, как это преодолеть. - person akella suresh kumar; 01.11.2013
comment
Ну, насколько я понимаю, проблема в том, что выполняется java-скрипт, привязывающий изображение к событию загрузки. Как только привязка завершена, java-скрипт завершается и управление возвращается Wicket. После этого загрузка изображения завершается и выполняется код внутри onLoad. Есть ли способ, я могу дождаться, пока событие загрузки не будет запущено и завершить обработку внутри onLoad(), а затем вернуться к контроллеру калитки.? - person akella suresh kumar; 02.11.2013