无限循环中的警报框,这里我试图在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();">
答案 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
放在循环