6

我有一个可以远程和正常使用的表格。

= form_for @comment, html: { class: 'comment-form' }, remote: request.xhr? do |f|
  = f.text_area :body
  = f.submit

我希望表单仅在bodytextarea 有内容时提交:

  $(document).on 'submit', '.comment-form', (e) ->
    text = $(this).find('#comment_body').val()
    false if text.length < 1

该代码在表单不是 Ajax 时有效。但是当它是远程的时,它会失败并且表单仍然提交。为什么?我也试过:

if text.length < 1
  e.preventDefault()
  false

我正在使用带有 Turbolinks 的 Rails 4。

更新:我尝试绑定ajax:beforeSend事件,它仍然提交:

  $(document).on 'page:load', '.comment-form', ->
    $(this).bind 'ajax:beforeSend', ->
      alert "hi"

没看到警报...

4

4 回答 4

4

您可能会为该ajax:beforeSend事件实现一个处理程序,以防止您的表单被提交。如果您的事件处理程序返回,看起来提交会停止false

维基:https ://github.com/rails/jquery-ujs/wiki/ajax

示例实现:在 beforeSend 上停止 $.ajax

于 2013-08-28T22:31:42.640 回答
4

我正在使用Rails 5.0.0.1,如可停止事件部分的jquery-ujs文档中所述,您只需在事件中返回一个值即可停止请求并阻止发送表单。falseajax:beforeSend

所以这对我来说非常有效:

$(document).on("ajax:beforeSend", "form#messages_form", function (e, data, status, xhr) {
    var len = $.trim($('#message_body').val()).length;

    if (len > 3) {
        console.log("Send form!");
        return true;
    } else {
        console.log("Stopping request...");
        return false;
    }
});

我希望它对其他人有用。

于 2017-03-13T20:45:49.053 回答
0

也许我没有得到您的问题,但是添加一个

:required => true

给你的text_area

于 2013-08-28T16:55:13.843 回答
0

这看起来像一个 jquery_ujs 问题。尝试将事件更改为:

 $('.comment-form').on 'submit', (e) ->

我面临同样的问题,只有这样才能解决问题。

于 2016-06-15T21:42:27.000 回答