jQuery返回false不起作用

时间:2015-05-04 12:56:19

标签: javascript jquery

我有一张桌子,我遍历每一行。 如果行背景颜色为绿色,并且未选中其类别为linebox的相应复选框,则应在单击提交时显示错误消息。 但返回false不起作用,表单正在提交。尽管消息显示。 我该如何解决这个问题? 以下是代码。

jQuery(document).on('click', '#add-All-button', function () {
  $(".rowb").each(function() {                       
    if($(this).css("background-color") == "rgb(71, 163, 71)") {
      var ischk = 0;
      var row = $(this);                        
      if (row.find('input[class="linebox"]').is(':checked') ) {
        ischk++;
      }
      if(ischk==0) {
        alert('Every green colored row should have one of the checkboxes checked.');
        return false;
      }
    }                       
  });
});

2 个答案:

答案 0 :(得分:7)

您没有从false回调中退出$.each退出事件处理程序。如果您还要从处理程序中返回false,那么您在处理程序本身中需要return语句。

例如,也许(参见***行):

jQuery(document).on('click', '#add-All-button', function() {
    var rv; // *** By default it's `undefined`, which has no special meaning, so that's fine
    $(".rowb").each(function() {
        if ($(this).css("background-color") == "rgb(71, 163, 71)") {
            var ischk = 0;
            var row = $(this);
            if (row.find('input[class="linebox"]').is(':checked')) {
                ischk++;
            }
            if (ischk == 0) {
                alert('Every green colored row should have one of the checkboxes checked.');
                rv = false; // ***
                return false;
            }
        }
    });
    return rv; // ***
});

旁注:这种比较很可能在野外失败:

$(this).css("background-color") == "rgb(71, 163, 71)"

不同的浏览器会以不同的格式返回颜色信息,并且不会以您设置的相同格式(必要)返回值。 jQuery并没有尝试将其标准化。因此,您获得的价值可能是"rgb(71, 163, 71)",但也可能是"rgb(71,163,71)""rgba(71, 163, 71, 0)""rgba(71,163,71,0)",甚至是"#47A347"。您可能最好使用data-*属性或通过jQuery data函数跟踪的值,而不是依赖于以特定格式获取值。

附注2:我不会使用按钮的click事件来挂钩表单提交过程;我改为使用submit的{​​{1}}事件。

答案 1 :(得分:3)

你需要在外部函数中返回false,在.each中返回false只会打破循环。您可能需要用来停止表单提交的另一个是event.preventDefault,可用于停止浏览器的默认行为,例如转到链接或提交表单,但您需要更改按钮上的事件类型适当地匹配。也就是说,您应该收听的事件是提交。有关详细信息,请查看下面的修复代码。

 jQuery(document).on('submit', '#add-All-button', function() {
     var out = true;
     $(".rowb").each(function() {
         if ($(this).css("background-color") == "rgb(71, 163, 71)") {
             var ischk = 0;
             var row = $(this);
             if (row.find('input[class="linebox"]').is(':checked')) {
                 ischk++;
             }
             if (ischk == 0) {
                 alert('Every green colored row should have one of the checkboxes checked.');
                 out = false;
             }
         }
     });
     if (!out) { event.preventDefault(); }
     return out;
 });