为何在onblur 事件中调用了alert 和focus 就会出现死循环?

yoshubom 2017-02-20 01:56:05
代码如下,页面中文本框里输入非数字的字符,然后触发onblur 事件,则一直弹出alert(),Safari 和Chrome 都是一样的情况。


<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<form name="frm">
<label for="age">Please Enter Your Number</label>
<input type="text" name="age" id="age" onblur="validate(this.value)" />
<input type="submit" id="Enter" />
</form>

<script language="javascript">

function validate(val) {
if(isNaN(val)) {
alert("XXX XXX XXX");
document.getElementById("age").focus();
}
}

</script>
</body>
</html>
...全文
2323 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
五姐 2018-10-17
  • 打赏
  • 举报
回复
说的好详细呀,佩服
jio可 2017-02-20
  • 打赏
  • 举报
回复
因为一直在失去焦点获取焦点的死循环。。
yoshubom 2017-02-20
  • 打赏
  • 举报
回复
引用 4 楼 alwayslovelin 的回复:
楼上两位的回答太高冷了。。。我来个详细的吧。 为什么会发生死循环呢,说白了就是因为JS的异步,JS在执行到alert的时候并不是像你想象的那样先打印,打印完了再聚焦,其实犹豫聚焦动作容易执行,JS先把它给做了,也就是说最后实际的操作是聚焦、打印,这样当然就会再一次触发焦点失去事件了。 望采纳~
后来想了想,估计也是先执行了focus,然后再显示alert 结果造成了焦点转移,多谢回复!
yoshubom 2017-02-20
  • 打赏
  • 举报
回复
引用 1 楼 天际的海浪的回复:

    function validate(val) {            
        if(isNaN(val)) {
            alert("XXX XXX XXX");
            setTimeout(function () {
   	            document.getElementById("age").focus();
            }, 500);
        }
    }
感谢回复!请问为何用了alert 会不停地触发onblur 事件呢?
alwayslovelin 2017-02-20
  • 打赏
  • 举报
回复
楼上两位的回答太高冷了。。。我来个详细的吧。 为什么会发生死循环呢,说白了就是因为JS的异步,JS在执行到alert的时候并不是像你想象的那样先打印,打印完了再聚焦,其实犹豫聚焦动作容易执行,JS先把它给做了,也就是说最后实际的操作是聚焦、打印,这样当然就会再一次触发焦点失去事件了。 望采纳~
天际的海浪 2017-02-20
  • 打赏
  • 举报
回复

    function validate(val) {            
        if(isNaN(val)) {
            alert("XXX XXX XXX");
            setTimeout(function () {
   	            document.getElementById("age").focus();
            }, 500);
        }
    }
一、前言 1 二、JavaScript的程序控制结构和对象 2 1、for循环语句: 2 2、while循环: 2 3、do-while循环: 2 4、JavaScript函数: 2 5、在JavaScript基于对象的编程: 3 6、内置的JavaScript对象: 3 7、处理对象的内置方法: 3 8、用户自定义对象: 4 9、使用IE的Scriptlet: 4 三、Form元素:文本框和按钮 5 1、文本框: 5 2、按钮: 5 3、文本区: 6 4、口令密码: 6 5、确认按钮和重置按钮: 6 6、文件控件: 7 7、隐藏控件: 7 8、单选钮(事件onBlur、onClick、onFocus): 7 9、复选框(onBlur、onClick、onFocus): 7 10、将复选框和单选钮组合起来: 7 11、使用elements[]数组 8 12、选择框(事件onBluron、onChange、Focus): 9 四、鼠标和键盘事件 10 1、window.event的属性(比如window.event.x): 10 2、鼠标按下与鼠标释放事件(onMouseDown、onMouseUp) 10 3、预览页面(onMouseOver): 11 4、图像切换(onMouseOver、onMouseOut) 11 5、接收键盘输入(keyPress事件): 12 6、用鼠标点亮文本 12 五、处理图像与动画 13 1、图片数组: 13 2、IE的结构化图形控件 14 3、Web页面定位图像 15 4、图像映像 15 5、隔5ms自动换一幅图片, 15 6、用IE的DirectAnimation(DAViewerControl控件): 16 六、Document对象 16 1、对象: 16 2、document对象的属性: 16 七、Window对象 18 1、window对象: 18 2、window.open()方法:用来打开一个新窗口 18 3、警告框:alert(); 19 4、确认框:confirm() 19 5、提示框:prompt(“”,””) 20 6、对话框:showModalDialog() 20 八、浏览器、地址和历史对象 21 1、IE的”浏览器对象”属性:navigator.appName 21 2、使用地址对象:location.href 22 3、历史对象: 22 4、从URL串获取信息: 22 5、图像映像前的确认消息: 23 6、使用cookie: 23 7、改变状态栏文本: 23 九、将javascript和java连接起来 24 1、在javascript调用java的方法: 24 2、从javascript向java传递参数:通过set()方法传递参数 24 3、从java获取返回值:通过get()方法 24 4、直接在javascript使用java语句:经试验失败,提示“java未定义”。 25 5、从java访问javascript资源和方法:略 25 十、插入件 25
js表单验证控制代码大全 /* 目录: 1:js 字符串长度限制、判断字符长度 、js限制输入、限制不能输入、textarea 长度限制 2.:js判断汉字、判断是否汉字 、只能输入汉字 3:js判断是否输入英文、只能输入英文 4:js只能输入数字,判断数字、验证数字、检测数字、判断是否为数字、只能输入数字 5:只能输入英文字符和数字 6: js email验证 、js 判断email 、信箱/邮箱格式验证 7:js字符过滤,屏蔽关键字 8:js密码验证、判断密码 2.1: js 不为空、为空或不是对象 、判断为空 、判断不为空 2.2:比较两个表单项的值是否相同 2.3:表单只能为数字和"_", 2.4:表单项输入数值/长度限定 2.5:文/英文/数字/邮件地址合法性判断 2.6:限定表单项不能输入的字符 2.7表单的自符控制 1. 检查一段字符串是否全由数字组成 2. 怎么判断是否是字符 3. 怎么判断是否含有汉字 4. 邮箱格式验证 5. 数字格式验证 6. 电话号码格式验证 7. 判断输入是否为文的函数 8. 综合的判断用户输入的合法性的函数 9. 判断密码是否输入一致 10. 判断用户名是否为数字字母下滑线 2.8:form文本域的通用校验函数 */ 1. 长度限制 function test() { if(document.a.b.value.length>50) { alert("不能超过50个字符!"); document.a.b.focus(); return false; } } 2. 只能是汉字 3." 只能是英文 function onlyEng() { if(!(event.keyCode>=65&&event.keyCode<=90)) event.returnvalue=false; } 4. 只能是数字 function onlyNum() { if(!((event.keyCode>=48&&event.keyCode=96&&event.keyCode<=105))) //考虑小键盘上的数字键 event.returnvalue=false; } 5. 只能是英文字符和数字 6. 验证油箱格式 function isEmail(strEmail) { if (strEmail.search(/^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/) != -1) return true; else alert("oh"); } 7. 屏蔽关键字(这里屏蔽***和****) function test() { if((a.b.value.indexOf ("***") == 0)||(a.b.value.indexOf ("****") == 0)){ alert(":)"); a.b.focus(); return false;} }

87,910

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧