Я наблюдал странное поведение со следующим кодом:
$.fn.submit_to_remote = function() {
// I use .each instead of the .submit directly so I can save
// the 'submitEnabled' variable separately for each form
jQuery.each($(this), function() {
$(this).submit(function() {
form = $(this);
if (form.data('submitEnabled') == false) { alert('disabled'); return false; }
form.data('submitEnabled', false);
$.ajax({type: 'POST', url: 'url', data: data, dataType: 'script',
success: function(script) {
alert('success')
}
})
return false;
})
})
}
$('.submit_to_remote').submit_to_remote();
Таким образом, при вызове submit_to_remote в форме (формах) он отключает обычную отправку и затем выполняет запрос AJAX POST.
Странно то, что форма публикуется несколько раз, как будет показано предупреждение «отключено». Как вы видите, я предотвращаю это, используя «переменную», сохраненную в объекте формы, и проверяю эту переменную, чтобы увидеть, была ли форма уже отправлена.
При дальнейшем тестировании кажется, что виновником является скрипт, возвращаемый вызовом AJAX. Позвольте мне немного объяснить, что я делаю, чтобы было понятнее.
Форма отправляется на сервер, а скрипт возвращается. Скрипт снова показывает форму, но на этот раз с сообщениями об ошибках для некоторых полей. Обратите внимание, что форма полностью заменена.
Сценарий, после отображения новой формы, выполняет это:
$('.submit_to_remote').submit_to_remote();
Я должен сделать это, потому что в противном случае, когда вы снова нажмете кнопку отправки, форма будет отправлена нормально, без AJAX.
Итак, скажем, пользователь отправляет форму и возвращается с соответствующими ошибками (предупреждение «отключено» не отображается). Затем он представляет это снова; на этот раз предупреждение «отключено» отображается один раз. Теперь он отправляет его еще раз, и на этот раз предупреждение показывается дважды! И так далее ...
Так что может показаться, что обратный вызов .submit добавляется снова и снова с каждым запросом, но почему?
Может быть, при использовании .html () исходная форма сохраняется как призрак или что-то в этом роде?
Спасибо!
PS: Если это уместно, вот скрипт, возвращаемый вызовом $ .ajax:
replace_content_with = 'the form and other stuff here';
$('.page-content').html(replace_content_with);
$('.submit_to_remote').submit_to_remote();