byłem obserwując niektóre dziwne zachowanie z następującego kodu:
$.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();
Więc w zasadzie, na wywołanie submit_to_remote na zasadzie formularz (y), wyłączy to normalne przesłanie, a następnie złoży zapytanie o POST AJAX.
Dziwne jest to, że formularz jest wysyłany wiele razy, ponieważ pojawi się komunikat "wyłączony". Jak widzisz, zapobiegam temu, używając "zmiennej" zapisanej w obiekcie formularza i sprawdzając tę zmienną, aby zobaczyć, czy formularz został już przesłany.
Po dalszych testach wydaje się, że winowajcą jest skrypt zwrócony przez wywołanie AJAX. Pozwól mi wyjaśnić nieco, co robię, więc jest bardziej zrozumiały.
Formularz zostanie opublikowany na serwerze i zwrócony zostanie skrypt. Skrypt ponownie pokazuje formularz, ale tym razem z komunikatami o błędach dla niektórych pól. Zwróć uwagę, że formularz został całkowicie zastąpiony.
Skrypt, po przedstawiający nową formę, wykonuje to:
$('.submit_to_remote').submit_to_remote();
muszę zrobić, bo inaczej, po kliknięciu na przycisk złożyć ponownie, formularz jest składany normalnie, bez AJAX.
Załóżmy, że użytkownik przesyła formularz i jest on zwracany z odpowiednimi błędami (alert "wyłączony" nie jest wyświetlany). Następnie składa to ponownie; tym razem alert "wyłączony" jest wyświetlany jeden raz. Teraz przesyła go jeszcze raz i tym razem alert jest wyświetlany dwukrotnie! I tak dalej ...
Wygląda na to, że wywołanie zwrotne .submit jest dołączane wielokrotnie przy każdym żądaniu, ale dlaczego?
Czy to możliwe, że przy użyciu .html() oryginalna forma jest trzymana jako duch czy coś?
Dzięki!
PS: W przypadku jest to istotne, oto skrypt zwrócony przez wywołanie $ .ajax:
replace_content_with = 'the form and other stuff here';
$('.page-content').html(replace_content_with);
$('.submit_to_remote').submit_to_remote();
Zapomniałem wspomnieć, że próbowałem tego również, ale to dziwnie nie działa, ponieważ wtedy nowa forma nie będzie miała zachowania AJAX, nawet czy wiążę je ze skryptem ... – Ivan
+1 Mogłem użyć tego jako rozwiązania tutaj: http://stackoverflow.com/questions/12340484/duplicated-entries-to-mysql-using-jquery-ajax-and-php/12340646#12340646 –