一个判断是否是数字的js去大神修改

qingwadaxia_1 2018-01-06 10:32:10
<input id="aa" type="text"/>


<script>
var aa = document.getElementById("aa");
aa.onblur = function(){
if(isNaN(aa.value)){
alert("不是数字");
aa.value = "";
aa.focus();
return false;

}else{
alert("是数字");
return false;
}
}
<script>

这是一个判断是否为数字的js,我想让它

为空时 不做任何提醒(现在为空会提示是数字)
输入非数字的时候,鼠标会聚焦输入框 这时候会一直弹出不是数字, 我想只弹一次就不弹了,

就上面两个问题 去大神帮忙修改下
...全文
414 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
qingwadaxia_1 2018-01-08
  • 打赏
  • 举报
回复
引用 8 楼 jslang 的回复:
你是用的谷歌浏览器吧,谷歌浏览器对alert()与元素焦点的转换很怪异。 大致是谷歌浏览器中,在弹出 alert()时并不是立刻使当前元素(aa)失去焦点,而是要等到关闭对话框并且当前线程执行结束后才会使元素(aa)失去焦点。但在这之前关闭对话框后焦点会回到先前的元素上。 这样如果在这个线程中执行aa.focus();使aa获得焦点,线程结束后又会失去焦点,触发onblur事件再次弹出对话框,关闭对话框后焦点会回到先前的元素上,线程结束又失去焦点,如此反复循环。 用setTimeout主要是让程序在新的线程中执行aa.focus()。可以一定程度的避免这种循环。 你ctrl+u查看源码 或选择其它网页选项卡,也会让焦点在当前线程执行时失去,造成这种循环。
这种情况是没有办法解决的是吗
天际的海浪 2018-01-08
  • 打赏
  • 举报
回复
这个问题就是由于种种原因让onblur事件连续触发,只要在触发一次事件之后暂时将事件解除,过一段时间再重新绑定事件。事件不能连续触发了。
qingwadaxia_1 2018-01-08
  • 打赏
  • 举报
回复
引用 10 楼 jslang 的回复:

var aa = document.getElementById("aa");
aa.onblur = blurFn;
function blurFn() {
	aa.onblur = null;
	if (isNaN(aa.value)) {
		alert("不是数字");
		aa.value = "";
	} else if(aa.value!="") {
		alert("是数字");
	}
	setTimeout(function(){
		aa.onblur = blurFn;
	}, 200);
	return false;
}
引用 10 楼 jslang 的回复:

var aa = document.getElementById("aa");
aa.onblur = blurFn;
function blurFn() {
	aa.onblur = null;
	if (isNaN(aa.value)) {
		alert("不是数字");
		aa.value = "";
	} else if(aa.value!="") {
		alert("是数字");
	}
	setTimeout(function(){
		aa.onblur = blurFn;
	}, 200);
	return false;
}
您有空或者愿意说 麻烦请您讲解下 为什么这样做 就可以避免那种情况
qingwadaxia_1 2018-01-08
  • 打赏
  • 举报
回复
引用 10 楼 jslang 的回复:

var aa = document.getElementById("aa");
aa.onblur = blurFn;
function blurFn() {
	aa.onblur = null;
	if (isNaN(aa.value)) {
		alert("不是数字");
		aa.value = "";
	} else if(aa.value!="") {
		alert("是数字");
	}
	setTimeout(function(){
		aa.onblur = blurFn;
	}, 200);
	return false;
}
没说的 就是牛逼!!
天际的海浪 2018-01-08
  • 打赏
  • 举报
回复

var aa = document.getElementById("aa");
aa.onblur = blurFn;
function blurFn() {
	aa.onblur = null;
	if (isNaN(aa.value)) {
		alert("不是数字");
		aa.value = "";
	} else if(aa.value!="") {
		alert("是数字");
	}
	setTimeout(function(){
		aa.onblur = blurFn;
	}, 200);
	return false;
}
天际的海浪 2018-01-06
  • 打赏
  • 举报
回复
你是用的谷歌浏览器吧,谷歌浏览器对alert()与元素焦点的转换很怪异。 大致是谷歌浏览器中,在弹出 alert()时并不是立刻使当前元素(aa)失去焦点,而是要等到关闭对话框并且当前线程执行结束后才会使元素(aa)失去焦点。但在这之前关闭对话框后焦点会回到先前的元素上。 这样如果在这个线程中执行aa.focus();使aa获得焦点,线程结束后又会失去焦点,触发onblur事件再次弹出对话框,关闭对话框后焦点会回到先前的元素上,线程结束又失去焦点,如此反复循环。 用setTimeout主要是让程序在新的线程中执行aa.focus()。可以一定程度的避免这种循环。 你ctrl+u查看源码 或选择其它网页选项卡,也会让焦点在当前线程执行时失去,造成这种循环。
qingwadaxia_1 2018-01-06
  • 打赏
  • 举报
回复
引用 5 楼 jslang 的回复:
aa.focus();加个延时执行

var aa = document.getElementById("aa");
aa.onblur = function() {
	if (isNaN(aa.value)) {
		alert("不是数字");
		aa.value = "";
		setTimeout(function(){
			aa.focus();
		}, 200);
		return false;

	} else if(aa.value!="") {
		alert("是数字");
		return false;
	}
大神 现在有个问题, 当输入框输入数字之后,鼠标选中输入框, 然后ctrl+u 查看源码 还会一直弹出提示框,或者输入数字之后, 鼠标选中输入框,再选择其它网页选项卡, 也一样会一直弹出提示框
qingwadaxia_1 2018-01-06
  • 打赏
  • 举报
回复
引用 5 楼 jslang 的回复:
aa.focus();加个延时执行

var aa = document.getElementById("aa");
aa.onblur = function() {
	if (isNaN(aa.value)) {
		alert("不是数字");
		aa.value = "";
		setTimeout(function(){
			aa.focus();
		}, 200);
		return false;

	} else if(aa.value!="") {
		alert("是数字");
		return false;
	}
大神 我想请问下您 为什么加个延时 就可以有效避免一直弹出提示 而且我发现即便去掉延时, 也能避免一直弹出 这是什么道理呢?
天际的海浪 2018-01-06
  • 打赏
  • 举报
回复
aa.focus();加个延时执行

var aa = document.getElementById("aa");
aa.onblur = function() {
	if (isNaN(aa.value)) {
		alert("不是数字");
		aa.value = "";
		setTimeout(function(){
			aa.focus();
		}, 200);
		return false;

	} else if(aa.value!="") {
		alert("是数字");
		return false;
	}
qingwadaxia_1 2018-01-06
  • 打赏
  • 举报
回复
。。。这个没办法解决的吗,不可能吧。。
#麻辣小龙虾# 2018-01-06
  • 打赏
  • 举报
回复
引用 1 楼 CodingNoob 的回复:
<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>baidu</title>
	<link rel="stylesheet" href="css/baidu.css">
	<script src="js/jquery-1.11.3.min.js"></script>

</head>
<body>
<h2>输入数字:</h2>
<input id="aa" type="text"/>


<script>
var aa = document.getElementById("aa");

aa.onblur = function(){
if(isNaN(aa.value)){
alert("不是数字");
return false;

}else if(aa.value !== ""){

alert("是数字");
return false;
}
}
</script>
</body>
</html>
去掉这两行 aa.value = ""; aa.focus(); 再多加一个判断不为空就好了。
这样的话,对话框你通过div模拟的形式弹出吧,因为alert弹出后会阻塞浏览器,当你点击确定之后会执行之后的代码,然后后对应的input又会触发onblur事件,会陷入死循环,无限弹出alert窗口。onblur、onfocus事件用alert时要小心。
qingwadaxia_1 2018-01-06
  • 打赏
  • 举报
回复
引用 1 楼 CodingNoob 的回复:
<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>baidu</title>
	<link rel="stylesheet" href="css/baidu.css">
	<script src="js/jquery-1.11.3.min.js"></script>

</head>
<body>
<h2>输入数字:</h2>
<input id="aa" type="text"/>


<script>
var aa = document.getElementById("aa");

aa.onblur = function(){
if(isNaN(aa.value)){
alert("不是数字");
return false;

}else if(aa.value !== ""){

alert("是数字");
return false;
}
}
</script>
</body>
</html>
去掉这两行 aa.value = ""; aa.focus(); 再多加一个判断不为空就好了。
我想弹出不是数字后 聚焦在输入框 然后清空
#麻辣小龙虾# 2018-01-06
  • 打赏
  • 举报
回复
<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>baidu</title>
	<link rel="stylesheet" href="css/baidu.css">
	<script src="js/jquery-1.11.3.min.js"></script>

</head>
<body>
<h2>输入数字:</h2>
<input id="aa" type="text"/>


<script>
var aa = document.getElementById("aa");

aa.onblur = function(){
if(isNaN(aa.value)){
alert("不是数字");
return false;

}else if(aa.value !== ""){

alert("是数字");
return false;
}
}
</script>
</body>
</html>
去掉这两行 aa.value = ""; aa.focus(); 再多加一个判断不为空就好了。

87,990

社区成员

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

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