chrome 中的 onblur onfocus 无限循环问题

Siv*_*ran 4 html javascript google-chrome onfocus onblur

javascript 函数用于验证在 OnBlur 事件中调用的数字。如果该值无效,它将提醒弹出窗口并将焦点返回到该字段。

示例代码:

<!DOCTYPE html>
<html>
<body>

Enter your number: <input type="text" id="fname" onfocus="this.select()" onblur="myFunction(this)">

<script>
function myFunction(field) {
    if( isNaN(field.value)){
    alert('wrong !!!');
    field.focus();
    return false;
    }
}
</script>

</body>
</html>
Run Code Online (Sandbox Code Playgroud)

验证在 Internet Explorer 11(版本 11.447.14393.0)/ Windows 10 中工作正常。

但是在 chrome 中单击确定或关闭警报按钮后,焦点不会返回到字段。再次弹出警报。因此,每次确定/关闭单击时,警报都会无限弹出。

镀铬版本是 63.0.3239.132

Vig*_*aja 6

这看起来像一个chrome bug。也许您可以在crbug.com 上对其进行归档/投票。

您可以通过一些变通方法来满足您的需求。

  1. 将字段值设置为empty value.

function myFunction(field)
{
    if(isNaN(field.value))
    {
        alert('wrong !!!');
        field.value="";
        field.focus();
        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)
Enter your number: <input type="text" id="fname1" onfocus="this.select()" onblur="myFunction(this)">
Run Code Online (Sandbox Code Playgroud)

  1. 如果您不需要清除该值,请将元素聚焦在setTimeout.

function myFunction(field)
{
    if(isNaN(field.value))
    {
        alert('wrong !!!');
        setTimeout(function(){
            field.focus();
        },0);
        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)
Enter your number: <input type="text" id="fname1" onfocus="this.select()" onblur="myFunction(this)">
Run Code Online (Sandbox Code Playgroud)

  1. alert完成后删除和添加 onblur 事件。

function myFunction(field)
{
    if(isNaN(field.value))
    {
        alert('wrong !!!');
        var onblurevent=field.onblur;
        field.onblur = "";
        setTimeout(function(){
            field.focus();
            field.onblur=onblurevent;
        },0);
        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)
Enter your number: <input type="text" id="fname1" onfocus="this.select()" onblur="myFunction(this)">
Run Code Online (Sandbox Code Playgroud)