2

我正在尝试在 JavaScript 中创建一个类来验证表单。这将检查表单元素并验证字段是否具有特定属性。

但是,调用getAttribute没有返回值。它不会在另一个变量中获取值,但是,如果我打印,它工作得很好。

这是我的课程的代码:

function valida() {
    document.getElementById("msgDiv").innerHTML="";
    var totalErros=0; 
    var x=document.getElementById("frm1");
    for (var i=0;i<x.length;i++){
        var input=document.getElementsByTagName("input")[i];
        var campo=input.getAttribute("id");
        var tipo=input.getAttribute("tipo");
        var nome=input.getAttribute("nome");
        var id=campo.toString(); //the error goes here
        //var valor=_$(id).value;
        alert(campo);

        switch (tipo) {
            case "obrigatorio":
                if(document.getElementById(id).value==""){
                    document.getElementById("msgDiv").innerHTML+="Deu erro no campo "+nome+"<br />"; 
                    totalErros++;}
                    break
            case "oemail":
                if(document.getElementById(id).value==""){
                    document.getElementById("msgDiv").innerHTML+="Deu erro no campo "+nome+"<br />"; 
                    totalErros++;}
                    break
            case "email":
                if(!ValidaEmail(document.getElementById(id).value)){
                    document.getElementById("msgDiv").innerHTML+="O "+nome+" que você informou é inválido "+document.getElementById(id).value+"  <br />"; 
                    totalErros++;}
                    break
            default:
                document.getElementById("msgDiv").innerHTML+="<br />";
        }            
    }
    if(totalErros==0) {  
        document.getElementById("msgDiv").innerHTML="Agora foi "+ totalErros;
        return true;
    }
}
4

2 回答 2

2

你的问题是这样的:

var input=document.getElementsByTagName("input")[i];
var campo=input.getAttribute("id");
//...
var id=campo.toString(); //the error goes here

您正在获取给定的输入元素并将其存储在变量中input。然后,您将获取该元素的 ID 并将其存储在变量中campo。然后你campo在它上面调用并调用 toString() 。

问题是至少一个输入元素没有 ID。因为你不能调用toStringon null,所以你会得到一个错误。

你实际上并不需要首先打电话toString()。只需campo按原样使用。它将为空(如果没有 ID)或字符串。

于 2012-12-20T13:26:11.910 回答
1

你的这部分代码激起了我的好奇心:

var x=document.getElementById("frm1");
for (var i=0;i<x.length;i++){
    var input=document.getElementsByTagName("input")[i];

这会收集您页面上所有 <input>元素的集合,并且每次都取i一个;谁知道你会得到什么输入元素。

如果您只想遍历您感兴趣的表单元素,这会更容易和更快:

var x = document.getElementById('frm1'),
input,
campo;

for (var i = 0, n = x.length; i != n; ++i) {
    input = x.elements[i];
    if (campo = input.id) {
        // rest of your code
    }
}

如您所见,我采用的是id属性而不是id属性;这通常是更好的做法,因为属性的变化可能并不总是反映在相应的属性中。

此外,.toString()是多余的,如果不为空,它已经是一个字符串。

更新

正如@bfavaretto 在评论部分指出的那样,这部分代码也可以简化:

if(document.getElementById(id).value==""){    

对此:

if (input.value == '') {

无论输入元素是否有 id 都可以

于 2012-12-20T13:32:52.900 回答