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。次に、campotoString() を取得して呼び出します。

問題は、少なくとも 1 つの入力要素に ID がないことです。toStringを呼び出すことができないnullため、エラーが発生します。

toString()そもそも電話する必要はありません。そのままご使用campoください。null (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>要素のコレクションを取得し、毎回ithを取得します。そして、あなたが得るかもしれない入力要素を誰が知っていますか。

関心のあるフォームの要素だけをトラバースしたいだけなら、これははるかに簡単で高速です:

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()は不要です。null でない場合は、すでに文字列です。

アップデート

コメント セクションで @bfavaretto が指摘したように、コードのこの部分も簡略化できます。

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

これに:

if (input.value == '') {

入力要素にIDがあるかどうかに関係なく機能します

于 2012-12-20T13:32:52.900 に答える