Mssmar: Array und Properties

Hallo,

irgendwie blicke ich durch diesen kleinen Code nicht mehr.

Wieso wird hier: "document.forms[0].mails has no properties". ausgegeben?
Der Code-Schnipßel ist ein Witz und ich sehe den Fehler trotzdem nicht. Birn out ;-((

Jemand einen Tipp?

Danke und Gruß
Messmar

  
function checkFriendsMails(){  
 //alert(document.forms[0].email_4.value);  
 var i;  
 var mails = new Array("email_1", "email_2", "email_3", "email_4");  
  
 //alert(mails.length);  
  
 for(i=0; i<mails.length; i++){  
  alert(mails[i]);  
  if (document.forms[0].mails[i].value == "") alert('Plese fill in the Fields');  
  else alert('That is fine, go a head');  
 }  
}  

Der zugehörige Html-Code:

  
 <form name="qqqqa" onsubmit=" checkFriendsMails();">  
     <label style="width:180px;background:transparent;"><strong>Friends email adresses:</strong></label>  
<br>  
    <ul style="list-style-type: decimal;font-size:10px;">  
 <li><input type="text" name="email_1" value="" /></li>  
 <li><input type="text" name="email_2" value="" /></li>  
 <li><input type="text" name="email_3" value="" /></li>  
 <li><input type="text" name="email_4" value="" /></li>  
    </ul>  
    <input type="Submit" value="xxxx">  
</form>  

  1. Hallo,

    function checkFriendsMails(){
    //alert(document.forms[0].email_4.value);
    var i;
    var mails = new Array("email_1", "email_2", "email_3", "email_4");

    //alert(mails.length);

    for(i=0; i<mails.length; i++){
      alert(mails[i]);
      if (document.forms[0].mails[i].value == "") alert('Plese fill in the Fields');

    //                         ^hier versuchst Du eine Eigenschaft mails anzusprechen, welche das Form-Element aber nicht hat.

    else alert('That is fine, go a head');
    }
    }

      
    Ich nehme an, Du willst nacheinander die Elemente mit den namen "email\_1", "email\_2", "email\_3", "email\_4" ansprechen?, dann:  
      
    
    > ~~~javascript
      
    
    > function checkFriendsMails(){  
    >  //alert(document.forms[0].email_4.value);  
    >  var i;  
    >  var mails = new Array("email_1", "email_2", "email_3", "email_4");  
    >   
    >  //alert(mails.length);  
    >   
    >  for(i=0; i<mails.length; i++){  
    >   alert(mails[i]);  
    
       if (document.forms[0].elements[mails[i]].value == "") alert('Please fill in the Fields');  
    
    >   else alert('That is fine, go a head');  
    >  }  
    > }  
    > 
    
    

    Siehe auch http://de.selfhtml.org/javascript/objekte/elements.htm#allgemeines dort Schema 4 / Beispiel 4.

    viele Grüße

    Axel

    1. Hallo Axel,

      Ich nehme an, Du willst nacheinander die Elemente mit den namen "email_1", "email_2", "email_3", "email_4" ansprechen?, dann:

      function checkFriendsMails(){
      //alert(document.forms[0].email_4.value);
      var i;
      var mails = new Array("email_1", "email_2", "email_3", "email_4");

      //alert(mails.length);

      for(i=0; i<mails.length; i++){
        alert(mails[i]);
         if (document.forms[0].elements[mails[i]].value == "") alert('Please fill in the Fields');
        else alert('That is fine, go a head');
      }
      }

      
      >   
      > Siehe auch <http://de.selfhtml.org/javascript/objekte/elements.htm#allgemeines> dort Schema 4 / Beispiel 4.  
        
      vielen Dank. genau das habe ich gesucht und kam ich einfach nicht drauf.  
        
      Aber eigentlich musste sowas:  
        
      ~~~html
        
      document.forms[0].mails[i].value  
      
      

      auch gehen, denn es sollte folgendes ausgegeben werden:

        
      document.forms[0].nameDesFeldes.value;  
      
      

      Viele Grüße
      Mssmar

      1. Hallo,

        Aber eigentlich musste sowas:

        document.forms[0].mails[i].value

        
        >   
        > auch gehen, denn es sollte folgendes ausgegeben werden:  
        > ~~~javascript
          
        
        > document.forms[0].nameDesFeldes.value;  
        > 
        
        

        Du meinst, dass mails[0] _vor_ der Interpretation des Ausdrucks document.forms[0].mails[i].value durch "email_1" ersetzt wird? Wenn das so implementiert wäre, nach welchem Kriterium sollte dann der JavaScript-Interpreter entscheiden, ob "mails" ein Variablenbezeichner oder ein Elementname oder wirklich eine Eigenschaft des FORM-Elements ist? Nein, das funktioniert so nicht.

        viele Grüße

        Axel

        1. Hallo,

          Du meinst, dass mails[0] _vor_ der Interpretation des Ausdrucks document.forms[0].mails[i].value durch "email_1" ersetzt wird? Wenn das so implementiert[...]

          Fine. Du hast Recht. Aber folgendes geht's auch

            
          document.forms[0][mails[i]].value  
          
          

          Gruß
          Mssmar

          1. Fine. Du hast Recht. Aber folgendes geht's auch

            document.forms[0][mails[i]].value

              
            Weil du ein Array mit dem Namen mails definiert hast, das zufälig die Namen der Felder enthält.  
              
            Struppi.
            
            1. Hallo,

              Weil du ein Array mit dem Namen mails definiert hast, das zufälig die Namen der Felder enthält.

              Das stimmt. Danke euch für die Tipps.

              Gruß
              Messmar

          2. Hallo,

            Aber folgendes geht's auch

            document.forms[0][mails[i]].value

            Ja, weil ein [HTMLFormElement](http://www.w3.org/TR/2003/REC-DOM-Level-2-HTML-20030109/html.html#ID-40002357) nur eine Collection oder NodeList hat, nämlich elements. Vorsicht mit dieser Notation! Bei Elementen mit mehreren Collections oder NodeLists geht das schief.  
              
            viele Grüße  
              
            Axel
            
    2. Hi Axel,

      Ich nehme an, Du willst nacheinander die Elemente mit den namen "email_1", "email_2", "email_3", "email_4" ansprechen?, dann:

      Ja, aber wie könnte es dann aussehen, wenn mindestens ein Feld ausgefüllt sein muss?

      Gruß
      Mssmar

      1. Hallo,

        Ich nehme an, Du willst nacheinander die Elemente mit den namen "email_1", "email_2", "email_3", "email_4" ansprechen?, dann:

        Ja, aber wie könnte es dann aussehen, wenn mindestens ein Feld ausgefüllt sein muss?

        Prüfe in der Schleife nicht, ob ein Feld leer ist, sondern ob ein Feld gefüllt ist (nicht leer ;-)). Sobald das zutrifft, lässt Du die Funktion true zurückgeben (return). Wenn die Schleife durchläuft (alle Felder sind leer), dann lässt Du die Funktion false zurückgeben. Je nach Rückgabewert der Funktion reagierst Du mit "Bitte füllen Sie mindestend ein Feld aus" bei false oder "Alles in Ordnung" bei true.

        viele Grüße

        Axel

        1. Hallo,
          [...]Je nach Rückgabewert der Funktion reagierst Du mit "Bitte füllen Sie mindestend ein Feld aus" bei false oder "Alles in Ordnung" bei true.

          Danke für den Tipp. habe es hin bekommen.

          Aber:

          kann man die einzelnen Formular-Felder, einen Eventhandler der selben Funktion, wo sie abgefragt werden, zuweisen?

          geht so was?

          Gruß
          Mssmar

          1. Hallo,

            kann man die einzelnen Formular-Felder, einen Eventhandler der selben Funktion, wo sie abgefragt werden, zuweisen?

            Ja, aber das würde ich lassen.

            Das Prinzip wäre, dass bei Eintreten eines Ereignisses auf dem Textfeld die Prüfroutine anspringt, den Inhalt des Feldes prüft und bei falschem oder fehlendem Inhalt warnt, wenn nicht schon ein anderes Feld richtig ausgefüllt ist. Das Problem ist, welcher Event wäre dafür geeignet?

            onclick, onfocus? Nein, denn beim ersten Klick bzw. Anspringen sind alle Felder in jedem Fall leer. Es würde also mindestens eine sinnlose Warnung erfolgen.

            onchange, onblur? Nein, denn es könnte durchaus sein, dass der Ausfüllende das bisher einzige ausgefüllte Feld wieder komplett löscht, um danach ein anderes auszufüllen. Das ergäbe wieder eine sinnlose Warnung.

            Nein, die Prüfroutine ist am besten onsubmit des Formulars aufgehoben. Dann ist klar, dass das Formular nun so abgeschickt werden sollte.

            viele Grüße

            Axel

            1. Hallo,

              Nein, die Prüfroutine ist am besten onsubmit des Formulars aufgehoben. Dann ist klar, dass das Formular nun so abgeschickt werden sollte.

              Vielen Dank für die ausführliche Erklärung. ich möchte nicht übertreiben, aber das ist genau was ich mir gedacht habe. vor allem was die Usibility bzw. Benutzerfreundlichkeit angeht.

              Konzeptionell, wäre das keine gute Idee.

              Danke noch Mal.
              Gruß
              Messmar