onfocusout for event..alert陷入无限循环

时间:2017-06-13 08:35:33

标签: javascript jquery

我在我的HTML标记中添加了onfocusout属性,并在函数中添加了一个警报,但是警报函数正在运行无限循环,因为它不在该元素的焦点上。

如何立即关闭该提醒?

例如:

<html>
<body>
  <input type="text" id="a" onfocusout="hello()" name="name" />
  <script>
    function hello(){
      var x= document.getElementById("a").value.length;
      if("x<6"){
         alert("minimum 6 digits");
         document.getElementById("a").value='';
         document.getElementById("a").focus();
      }
    }
  </script>
</body>
</html>

我的代码类似于运行无限警报的代码。

2 个答案:

答案 0 :(得分:1)

这种情况正在发生,因为当您使用focus时,它会重新附加focusout事件处理程序。所以你需要做的是,首先删除focusout事件处理程序,并在条件为true

时再次附加它
if(x < 6){
  alert("minimum 6 digits");
  $("#a").val('');
  $("#a").off("focusout");
  $("#a").focus();
  $("#a").on("focusout", hello);
}

此外,这还不够。因为在您将ID为'a'的输入值设置为''后,当您重新连接事件时,它将继续进入您的条件,因为当前值是''(这意味着它的长度为0),并将保持重新附加您的事件处理程序。因此,您需要另一个全局变量来检查,当前状态是否正在检查,或者没有

var check = false;

然后你需要在每次想要重新附加事件处理程序时检查该变量,如果它是false(意味着它当前没有检查),那么你可以重新附加。但是会重新附加,你将该变量设置为true。完成重新附加后,将该变量设置为false。

  if (check == false)
  {
    if(x < 6){
      check = true;
      alert("minimum 6 digits");
      $("#a").val('');
      $("#a").off("focusout");
      $("#a").focus();
      $("#a").on("focusout", hello);
    }
  }
  else
  {
    check = false;
  }

演示:https://jsfiddle.net/t3aoenvd/

答案 1 :(得分:0)

试试这个

<html>
    <body>
        <input type="text" id="a" onfocusout="hello()" name="name" />
        <script>
        function hello(){
             var x= document.getElementById("a").value.length;
             if(x < 6){
                     alert("minimum 6 digits");
                     document.getElementById("a").value='';
                     document.getElementById("a").focus();
             }
        }
        </script>
    </body>
</html>