无限循环中的Javascript警报消息

时间:2011-06-15 10:29:51

标签: javascript html javascript-events

无限循环中的警报框,这里我试图在2个连续的字段上放置一条弹出警报消息,这样它们就不会留空,我知道它为什么会发生 - 因为当启动第一个函数的onblur事件时,它会将焦点放在第二个&当它跳回到第二个文本字段的第一个onblur时启动。

我知道在表单级别完成验证会是最好的,但这是我的要求。

任何帮助?

Javascript代码

function x()
{
   if( document.getElementById("1").value.length==0)
   {
      alert('1 is required');
      document.getElementById("1").focus();
   }
}

function y()
{
   if(document.getElementById("2").value.length==0)
   {
      alert('2 is required');
      document.getElementById("2").focus();
   }
}

HTML代码

<input type="text" name="City Name" id="1" onblur="javascript:x();">
<input type="text" name="Kitty Name" id="2" onblur="javascript:y();">

13 个答案:

答案 0 :(得分:5)

您可以在onblur()事件中处理它,而不是在onchange()事件中处理它。

如果您仍想使用onblur(),请使用setTimeout内的焦点,如下所示。

alert('2 is required');
setTimeout(function() { document.getElementById("2").focus(); }, 100); 

答案 1 :(得分:4)

onblur上的字段无效时,尝试重新聚焦时会出现一个基本问题。如果用户决定离开,那就简单了。当他们点击远离田地时,他们会被强行收回。我已经看到用户被迫杀死他们的浏览器会话的情况,只是为了逃避过度热心的onblur验证。

我意识到这可能不是您所追求的确切解决方案,但我是否可以推荐另一种仍然涉及客户端验证的方法。

我建议您在onblur上以某种方式突出显示该字段无效。例如。在它旁边放一颗星,突出显示为红色等。这样你就可以省去alert,用户仍然可以控制。

当用户提交表单时,您会执行客户端检查并向他们显示提醒(请参阅@Phill Sacre的回答)

答案 2 :(得分:1)

我的建议:将验证合并到一个方法中,并按顺序检查每个方法。

所以(伪代码):

function validate() {
     for (field in fieldlist) {
         if (document.getElementById(field).value.length == 0) {
              displayerror();
              document.getElementById(field).focus();
         }
     }
}

这样您一次只能显示一个错误。

答案 3 :(得分:0)

我的建议是在执行其他输入的处理程序期间暂时禁用blur处理程序。

我还用适当的Javascript解决方案替换了您的HTML onblur,删除了空白行并添加了代码缩进。

我还更改了元素ID,不允许以数字开头;您的脚本在兼容的浏览器上根本不起作用。

<html>
<body>

<script type="text/javascript">
window.onload = function() {
   document.getElementById("input1").onblur = x;
   document.getElementById("input2").onblur = y;
};

function x() {
   if (document.getElementById("input1").value.length == 0) {
     alert('1 is required');

     // temporarily disable binding
     document.getElementById("input2").onblur = function() {};

     document.getElementById("input1").focus();

     // re-bind
     document.getElementById("input2").onblur = y;
   }
}

function y() {
   if (document.getElementById("input2").value.length == 0) {
     alert('2 is required');

     // temporarily disable binding
     document.getElementById("input1").onblur = function() {};

     document.getElementById("input2").focus();

     // re-bind
     document.getElementById("input1").onblur = x;
   }
}
</script>

<input type="text" name="City Name" id="input1" onblur="javascript:x();">
<input type="text" name="Kitty Name" id="input2" onblur="javascript:y();">

</body>
</html>

现在,这个脚本相当冗长,并且带有大量的代码重复。但为了保持主题,我将在另一天留下进一步的改进。

我还建议不要这样做;正如詹姆斯所说,这是恼人的

答案 4 :(得分:0)

我必须改变你的比较方式

document.getElementById("1").value.length==0

document.getElementById("1").value != ''

在我看来,长度始终不等于zero

答案 5 :(得分:0)

试试这个

<html>
    <head>
    <script>

function x() {
   if (document.getElementById("input1").value.length == 0 ) {
     alert('1 is required');
     document.getElementById("input1").focus();

   }
   else  if (document.getElementById("input2").value.length == 0 ) {
     alert('2 is required');
     document.getElementById("input2").focus(); 
   }

}

</script>
    </head>
    <body >
    cityname:
    <input type="text" name="City Name" id="input1" onblur="javascript:x();">
    <br/>
    KittyName:
<input type="text" name="Kitty Name" id="input2" onblur="javascript:x();">

    </body>
</html>

答案 6 :(得分:0)

这是我的解决方案:

function x()
{
   if( document.getElementById("1").value.length==0)
   {
      alert('1 is required');
      document.getElementById("1").focus();
      return false;
   }
   return true
}

function y()
{
   if(x() && document.getElementById("2").value.length==0)
   {
      alert('2 is required');
      document.getElementById("2").focus();
   }
}

因此,如果需要1,则不会评估y函数

答案 7 :(得分:0)

如果您修改这样的代码。 它可以解决。

<html>
<head>
<title>break alert infinite loop </title>
<script>
var e = function( _id ){
    return document.getElementById(_id);
};
window.onload = function(){
    e("test").onblur = function(){
        if( e("test").value != "11" ){
            Msg("Number[11] is only allow");
            e("test").focus();
        }
    };
};

/* fix start */
var beforeMsg = "";
/* fix end */

function Msg( msg ){
    /* fix start */
    if( msg == beforeMsg ){
        return;
    }
    beforeMsg = msg;
    /* fix end */

    alert(msg);

    /* fix start */
    setTimeout(function(){
        beforeMsg = "";
    },1000);
    /* fix end */
}

</script>
</head>
<body>
    <p>only 11 is allow</p>
    <input type="text" id="test"/>
</body>
</html>

答案 8 :(得分:0)

其他代码

common.js

if( window.COMMON_JS == undefined ){
    window.COMMON_JS = "common.js ver:1.0.0.1";

    window.AletMessage = "";
    MessageAlert = function( msg ){
        if( window.AletMessage == msg  ){
            return;
        }
        window.AletMessage = msg;
        alert(msg);
        setTimeout(function(){
            window.AletMessage = "";    
        },1000);
    };
}

的test.html

<html>
<head>
<script type="text/javascript" src="common.js"></script>
<script>
var e = function( _id ){
    return document.getElementById(_id);
};
window.onload = function(){
    e("test").onblur = function(){
        if( e("test").value != "11" ){
            MessageAlert("Number[11] is only allow");
            e("test").focus();
        }
    };
};
</script>
</head>
<body>
    <p>Only 11 allowed.</p>
    <input type="text" id="test"/>
</body>
</html>

答案 9 :(得分:0)

我有一个JS并且有一个函数,它被称为文本框的onblur事件,onblur该事件处于无限循环中。

之后,我宣布了一个全局变量(在JS的顶部和函数Var Isvalid = true;之外)

在功能中,执行验证码。

if (IsValid == true)
{   
    if validation is false.
    giving alert message.
    and updating the IsValid = false;
}

如果验证为true,则更新全局变量。 Isvalid = true;

在第二次递归中,它不会执行循环。如果在下一阶段发生模糊事件,则变量自动设置为True

答案 10 :(得分:0)

尝试以下Js代码。它会解决你的问题。

function x()
{
   if( document.getElementById("1").value.length==0)
   {
      if(alert('1 is required')){
          document.getElementById("1").focus();
      }
      else
          document.activeElement.blur();
   }
}


function y()
{
   if(document.getElementById("2").value.length==0)
   {
      if(alert('2 is required')){
           document.getElementById("2").focus();
      }
      else
          document.activeElement.blur();
   }
}

答案 11 :(得分:0)

使用超时可以禁用“target”元素上的onBlur事件并返回源元素。这适用于IE。

function focusWithoutEvents(object) {
    // Small timeout so that the active element will be the "next" element
    setTimeout(function() {
        var activeElement = document.activeElement;

        // Save the current onblur()
        var activeOnblur = activeElement.onblur;

        // Disable the onblur event
        activeElement.onblur = null;

        // Now we can focus without triggering onblur event
        object.focus();

        // With a small delay, put back the onblur code.
        setTimeout(function() {
            activeElement.onblur = activeOnblur
        }, 100);
    }, 100);
}

答案 12 :(得分:-1)

我认为这对你有用:

phone_found = any(nm[host]['address'].get('mac', None) == phone_mac for host in nm.all_hosts())

注意:
for(;;) { alert("I am a looping alert box!"); } 有助于改善。因为如果你做for(;;)for(i=0; i<Infinity; i++)将显示数字#0然后数字#1然后显示数字#2并最终显示数字#1073841824。
顺便说一句:放alert("Number #"+i);,每次都会显示数字#2。顺便说一句,JavaScript JSLint Checker网站告诉我不要将var i = 2放在循环