验证单个单选按钮在可用的 javascript 验证脚本中不起作用
Posted
技术标签:
【中文标题】验证单个单选按钮在可用的 javascript 验证脚本中不起作用【英文标题】:Validating a single radio button is not working in available javascript validation script 【发布时间】:2011-06-02 05:20:58 【问题描述】:我有随机生成的单选按钮系列,比如
<input type="radio" name="creatorusers" value="1">
<input type="radio" name="creatorusers" value="1">
<input type="radio" name="creatorusers" value="1">
<input type="radio" name="creatorusers" value="1">
.....so on
但我只得到一个单选按钮并执行为其提供的 javascript 验证以检查单选按钮是否被选中,然后它不起作用 请帮我解决这个问题。
mycreator = -1;
for (i=frm.creatorusers.length-1; i > -1; i--)
if (frm.creatorusers[i].checked)
mycreator = i; i = -1;
if (mycreator == -1)
alert("You must select a Creator User!");
return false;
【问题讨论】:
当我提醒“frm.creatorusers.length”时,我会收到“未定义”的警报,但在另一边,当有多个单选按钮时,此验证工作正常 【参考方案1】:你可以试试这样的:
<html>
<head>
<script type="text/javascript">
function confirmsubmit()
var btn = document.formname.buttonname
if (btn.checked == false)
window.alert("You did not click the button.");
btn.focus();
return false;
return true;
</script>
</head>
<body>
<form method="post" action="mailto:youremail@yourdomain.com"
name="formname" onsubmit="return confirmsubmit();">
click here: <input type="radio" name="buttonname"><br />
<p><input type="submit" value="Submit" name="submit"></p>
</form>
</body>
</html>
【讨论】:
【参考方案2】:应该这样做
function isRadioselected(btn)
if(typeof btn.length === 'number')
for(var i=0;i<btn.length;i++)
if(btn[i].checked) return true
else
if(btn.checked) return true
return false
【讨论】:
【参考方案3】:你可以这样做:
function validate(frm)
var isChecked = false;
for (var i=0; i<frm.elements.length; i++)
if (frm.elements[i].type === 'radio')
if (frm.elements[i].checked === true)
isChecked = true;
break;
if (isChecked === true)
return true;
else
alert('You should select an option first !');
现在你应该在onsubmit
形式的事件上调用上述函数:
<form onsubmit="return validate(this);">
现在validate
函数将确保至少选中一个单选按钮,否则不会提交。
【讨论】:
身份比较很好,但可能是你做得过火了吗? :) 例如isChecked
在你的代码中只能是布尔值,所以return isChecked
是一个安全的选择。另外,j
是什么?
“j”是从哪里来的?
我编辑了您的答案以在函数中传递表单,如果表单上没有 ID,则不使用 getElementById。在此页面上查看我的其他评论【参考方案4】:
始终 (!) 使用 var 关键字。否则,您的变量将在全局范围内(是的,甚至是函数体中的变量),这可能会导致一些难以追踪的错误。
与@Felix pointed out 一样,creatorusers
只有在表单中有多个具有该名称的元素时才会成为一个数组。您可以在必要时创建一个单元素数组来解决这个问题。
这是一个可以验证任意复选框列表的抽象函数。
function ensureChecked(checkboxes, error)
if (checkboxes)
var cbx = (checkboxes.length > 0) ? checkboxes : [checkboxes];
for (var i=0; i<cbx.length; i++)
if (cbx[i].checked)
return true;
alert(error);
return false;
调用
ensureChecked(frm.creatorusers, "You must select a Creator User!");
【讨论】:
我收到此错误:frm.creatorusers 未定义 [中断此错误] var rdo = (frm.creatorusers.length >...rm.creatorusers : frm.creatorusers; in firebug @OMThe:这意味着frm.creatorusers
未定义(呃)。显然,并不总是有一个具有此名称的表单域。只需事先检查它是否存在。 (这也意味着您并没有真正使用我的代码,而是其他东西。我不明白您当时为什么接受我的回答,以及为什么您在代码停止工作时不接受它。)
一定要通过表格!!! onsubmit="return validate(this)"
- 这也将使命名表单变得不必要。但是,如果您使用 document.getElementById("ID_OF_FORM") 确保表单具有 ID 而不仅仅是名称。 IE 将允许 getElementById("NAME_OF_FORM") 但其他浏览器不允许【参考方案5】:
啊,现在我明白了。如果您只有一个单选按钮,则 frm.creatorusers
不是数组。跳过它:
var mycreator = -1;
var checked = false;
if(typeof frm.creatorusers.length === 'number')
for (var i=frm.creatorusers.length; i--; )
if (frm.creatorusers[i].checked)
mycreator = i;
checked = true;
break;
else if(frm.creatorusers.checked)
mycreator = //? what here?
checked = true;
if(!checked)
alert("You must select a Creator User!");
return false;
如果mycreator
只是用来检查一个按钮是否被选中,你可以从上面的代码中完全删除它。
对您的代码的一些进一步说明:
始终使用var
声明变量,否则它们将是全局变量。
使用break
结束循环。
也许只是因为复制和粘贴的原因,但是有很多具有相同值的单选按钮并没有多大意义。
【讨论】:
kling 回答你的最后一点,它只是一个示例,因此它只是一个复制粘贴,其次你的代码不起作用,它总是给出消息“你必须选择一个创建者用户!”跨度> @OMThe Eternity:代码对我有用:jsfiddle.net/fkling/TbNux 可能还有其他问题。以上是关于验证单个单选按钮在可用的 javascript 验证脚本中不起作用的主要内容,如果未能解决你的问题,请参考以下文章