2011-01-12 5 views
1

У меня есть этот JS кодRails 3 Jquery плагин проверки

$(".new_milestone").validate({ 
    submitHandler: function(form) { 
    $(form).submitWithAjax(); 
    }, 
    errorPlacement: function(error, element) { 
     error.insertBefore(element); 
    } 
    }); 

Это все работает, errorPlacement и функцию submitWithAjax. Но когда я отправляю форму во второй раз без перезагрузки страницы, форма отправляется два раза. В следующий раз 3 раза и так далее.

Когда я делаю это

$(".new_milestone").validate({ 
      errorPlacement: function(error, element) { 
       error.insertBefore(element); 
      } 
      }); 
$(".new_milestone").submitWithAjax(); 

Он работает, но он делает AJAX пост даже если форма не является действительным.

Функция submitWithAjax выглядит следующим образом (спасибо Райан Бейтс)

jQuery.fn.submitWithAjax = function() { 
    this.submit(function() { 

    $.post(this.action, $(this).serialize(), null, "script"); 
    $('.spinning').show(); 
    $("#dialog_form").dialog("close") 
    return false; 
    }) 
    return this; 
}; 

Любые идеи о том, останавливая это поведение?

ответ

1

Это происходит потому, что ваша ssubmitWithAjax функции не * на самом деле * представить (огнь события), он присоединяет представить обработчик для того, когда submit происходит (что нормальное поведение делает) ... так как вы» повторного вызова его в представить ситуацию, просто удалите оболочку обработчика и на самом деле представить, как это:

jQuery.fn.submitWithAjax = function() { 
    $.post(this.attr("action"), this.serialize(), null, "script"); 
    $('.spinning').show(); 
    $("#dialog_form").dialog("close") 
    return false; 
}; 

Обратите внимание на .attr("action") изменение, потому что this не является объектом JQuery, не элемент а <form> DOM, так как это непосредственно в плагин.


Раньше вы были прикреплением дополнительногоsubmit обработчика каждый раз, поэтому вы получаете 1, 2, 3 .... представляет, просто вызывая отправку коду вы хотите, это не будет произошли, поскольку внутри submitHandler является действующим местом для продолжения и отправки в любом случае.

В качестве альтернативы функция обратного вызова $.post() не является обязательной, поэтому вы можете оставить ее null,, и она будет функционировать должным образом.

+0

Спасибо! У вас есть опыт работы с рельсами. Удаление обработчика отправки испортило маршрут POST для рельсов. Есть ли способ использовать функцию validate, а не «в ситуации отправки» –

+0

@Andreas - Функция 'submitHandler' только вызывается как часть события' submit' на '

', если проверка проверена. Вы используете мой код выше с первой версией '.validate()' в вашем ответе? –

+0

Да, я использую первый. Я думал, что могу попробовать без функции submitHandler. Может быть, какое-то утверждение if в действительной() функции? –

Смежные вопросы