每个jquery都会阻止警报循环

时间:2011-04-10 07:59:35

标签: jquery

首先看一下这段代码。示例I有5个输入字段,它们具有必需的类。

var errMsg = "This is required!"

$(function() {
   $(".required").each(function() {
      if($(this).val() == "" || $(this).val == errMsg) {
         $(this).val(errMsg);
      }
      else {
         alert("This should alert once");
      }
   });
}

我知道如果该字段有价值,它会提醒5次。我该怎样预防呢?我怎么能提醒它一次?我已经使用

event.stopImmediatePropagation
event.preventDefault

5 个答案:

答案 0 :(得分:4)

目前还不完全清楚你要做什么。两个选项:

  1. 停止each循环:

    您可以返回false

    来停止each循环
    var errMsg = "This is required!"
    
    $(function() {
       $(".required").each(function() {
          if($(this).val() == "" || $(this).val == errMsg) {
             $(this).val(errMsg);
          }
          else {
             alert("This should alert once");
             return false; // <=== Stop `each`
          }
       });
    }
    

    有关详细信息,请参阅the documentation

  2. 设置标志:

    如果您希望循环继续,但alert仅发生一次,请使用标记:

    var errMsg = "This is required!"
    
    $(function() {
       var alerted = false;
       $(".required").each(function() {
          if($(this).val() == "" || $(this).val == errMsg) {
             $(this).val(errMsg);
          }
          else {
             if (!alerted) {
                 alerted = true;
                 alert("This should alert once");
             }
          }
       });
    }
    

    如果这样做(让循环继续),请参阅Guffa's answer。他将警报移到了each之外,这使您可以更灵活地呈现信息,并且更加清晰。


  3. 偏离主题每次调用$()时,它会进行3-4次函数调用并分配内存。如果您发现自己在函数中重复相同的$(),请考虑一次并重复使用它。所以而不是:

    if($(this).val() == "" || $(this).val == errMsg) {
        $(this).val(errMsg);
    }
    

    这样做

    var $this = $(this);
    if($this.val() == "" || $this.val == errMsg) {
        $this.val(errMsg);
    }
    

    大部分时间没关系,因为你不会做几千次的事情,但这是一个很好的习惯。显然,如果您正在进行DOM查询并且DOM可能在一次调用和下一次调用之间发生了变化,那么不会缓存结果......

答案 1 :(得分:2)

你应该把警报放在循环之外,然后你需要一个变量来跟踪是否有空字段:

var errMsg = "This is required!"

$(function() {
   var showMsg = false;
   $(".required").each(function() {
      if($(this).val() == "" || $(this).val == errMsg) {
         $(this).val(errMsg);
      } else {
         showMsg = true;
      }
   });
   if (showMsg) alert("This should alert once");
}

答案 2 :(得分:1)

$(function() {
   $(".required").each(function() {
      if($(this).val() == "" || $(this).val == errMsg) {
         $(this).val(errMsg);
      }
      else {
         alert("This should alert once");
         return false;  // break the loop;
      }
   });
}

答案 3 :(得分:1)

使用旗帜。 这样,您不会在提醒消息后中断循环,但只提醒一次:

var errMsg = "This is required!"

$(function() {
    var ok = true;   
    $(".required").each(function() {
        if($(this).val() == "" || $(this).val == errMsg) {
            $(this).val(errMsg);
        }
        else {
           if(ok){
               alert("This should alert once");
               ok = false;
           }
       }
    });
 }

答案 4 :(得分:0)

<块引用>

试试这个代码

    $(function() {
    var errMsg = "This is required!";
    $alert_once = 0;
   $(".required").each(function() {
      if($(this).val() == "" || $(this).val() == errMsg) {
         $(this).val(errMsg);
         $alert_once = 1;
      }
      else {
         alert("This should alert once");
      }
   });
   if ($alert_once == 0) {
        alert('Alert Once');
   }
}