2016-03-18 3 views
0

Я хочу отправить форму с помощью ajax, поэтому я пытаюсь отключить ее отправку с помощью return false;. Когда я пользуюсьRails form return false works using .submit(), но не .on()

$('#post_form').submit(function() { 

return false; работает нормально. Так в чем проблема? Ну, я не хочу привязываться к #post_form. Я хочу использовать:

$(document).on('submit', '#post_form', function(e) { 

Но return false; не работает. e.preventDefault(); полностью терпит неудачу. Что происходит?

<%= f.button(:submit, name: "Post", title: "Post", 
       class: 'btn btn-default btn-xs notice_submit', id: 'postbutt' 
      ) do %> 
    <span class="glyphicon glyphicon-ok" aria-hidden="true"></span> 
<% end %> 

Javascript:

$(document).on('submit', '#post_form', function(e) { // return false; doesn't work 
// $('#post_form').submit(function() { // return false; works fine 
    if (validatePostForm()) { 
    $.ajax({ 
     type: 'POST', 
     url: $(this).attr('action'), 
     data: $(this).serialize(), 
     dataType: 'script' 
    }); 
    } 
    e.preventDefault(); // this doesn't do anything 
    return false;  // neither does this 
}); 

EDIT

Я только что обнаружил, что удаление remote: true из формы получает это работает, хотя я не понимаю, почему:

<%= form_for(:post, url: :posts, method: :post, 
        html: { class: "notice_form", id: "post_form" } 
        # remote: true 
        ) do |f| %> 
+0

Я предполагаю, что в последнем примере обработчик вообще не прикреплен, попробуйте добавить предупреждение или консоль. Это часто случается с turbolinks, если вы не обращаете внимания на различия в жизненном цикле страницы. – max

+0

Обработчик прилагается. Предупреждение перед «return false» появляется. – Bazley

ответ

1

Попробуйте положить e.preventDefault(); в начале функции. Это делается для того, чтобы убедиться, что он работает, поскольку что-то еще внутри функции может помешать его запуску, если оно расположено внизу.

Включить console.log ('test'); и откройте консоль отладки вашего браузера, чтобы узнать, действительно ли это срабатывает. В качестве альтернативы вы можете использовать alert ('test'); Проверять.

+0

Я положил e.preventDefault(); в начале и предупреждение в конце. Появится предупреждение, и форма по-прежнему отправляется дважды, что означает, что функция preventDefault() работает, но не работает. Расстроенный. – Bazley

+0

Это должно объяснить немного больше о пульте дистанционного управления:: true: http://edgeguides.rubyonrails.org/working_with_javascript_in_rails.html#form-for Кажется, что возникает некоторая путаница относительно того, почему «return false» будет не отменяет удаленных правдивых представлений, как замечено здесь: http://stackoverflow.com/questions/26245535/onsubmit-return-false-is-ignored-if-remote-true-in-rails-4 и http: //stackoverflow.com/questions/25387092/remote-true-form-avoids-js-field-validation – MTarantini

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