您好我在此代码中遇到了一个奇怪的错误:
function validateForm(aform) {
var s="";
//check if form has validator arr
if (aform.validatorArr) {
//Iterate over Form elements
for (var i=0;i<aform.validatorArr.length;i++) {
eval("var anelem=document.forms."+aform.name+"."+aform.validatorArr[i][1]);
var pattern=getPatternByName(aform.validatorArr[i][2]);
if (aform.validatorArr[i][4]=="radio") {
var fv="";
eval("var chkArray=aform."+aform.validatorArr[i][1]+";");
for (j=0;j<chkArray.length;j++) {
if (chkArray[j].checked) {
fv=chkArray[j].value;
}
}
if (validateValue(fv,pattern)==false) {
s+=aform.validatorArr[i][3]+"\n";
}
} else {
if (validateField(anelem,pattern)==false) {
s+=aform.validatorArr[i][3]+"\n";
}
}
}
//Report errors
if (s!="") {
alert(s);
return false;
}
}
return true;
}
元素列表后缺少] 第217行
这是第217行:
eval("var anelem=document.forms."+aform.name+"."+aform.validatorArr[i][1]);
任何想法都是错的?
这就是de函数的调用方式:submitForm('formbuilder_form'); 这与表单名称相同:
<form name="formbuilder_form" method="POST" action="processform.php" style="margin:0px">
问题已解决
在表单元素的onw中,有人认为这样做很好:
Js不喜欢这个。
感谢您帮助所有人。
答案 0 :(得分:2)
无需使用 eval
。试试这个:
var anelem = document.forms[aform.name][aform.validatorArr[i][1]];
答案 1 :(得分:2)
你为什么这样做? 你应该这样做:
var anelem=document.forms[aform.name][aform.validatorArr[i][1]];
但是从更新的帖子中可以看出,aform是一个字符串 - 而不是一个对象。所以你应该先得到一个对象。
aform=ocument.forms[aform]
答案 2 :(得分:2)
forms.fish
与forms['fish']
相同。因此,您可以使用[]来获取一个属性,该属性的名称存储在对象的字符串中,而不是邪恶的eval
。
最重要的提示:如果你发现自己曾经使用eval
,那么你可能犯了一个错误。
“document.forms。” + aform.name
特别滑稽,因为您正在尝试获取表单对象的name
并访问具有该名称的表单 - 这与您开始使用的表单对象相同!
然而:
submitForm( 'formbuilder_form')
是否使用eval
或[]是错误的:您将字符串传递给submitForm而不是表单对象。字符串没有name
属性。
让commitForm与普通表单提交过程分开是混乱的,并打破非JavaScript UA。如果你写:
<form method="post" action="processform.php" onsubmit="return submitForm(this);">
...
</form>
然后函数中的'aform'将成为表单对象,您可以像以下一样访问元素:
var anelem= aform[aform.validatorArr[i][1]];
无需担心document.forms
脚本提交按钮或表单名称。虽然,为了避免表单属性上的名称冲突,这是更好的:
var anelem= aform.elements[aform.validatorArr[i][1]];