Enrico: Auslesen dynamisch erzeugter id's funktioniert nicht komplett

Hallo,

ich möchte das "Honigtopf"-Verfahren in unsere Bandhomepage einbauen und habe zusätzlich zu den sichtbaren Textfeldern "Name" und "EMail" jeweils ein für unsere Besucher nicht sichtbares Textfeld definiert.

Um es Bots noch schwieriger zu machen weise ich den Textfeldern dynamisch erzeugte id's zu:

Bei den Honigtöpfen "Name" oder "EMail", dann ein zufälliger Buchstabe aus einem Array mit den Elementen "D", "S", "H", "F" und "T", zum Schluss ein zufälliger String. Bei den sichtbaren Textfeldern ist die Vorgehensweise die gleiche, nur wähle ich hier einen zufälligen Buchstaben aus dem Array mit den Elementen "R", "V", "W", "P" und "I" aus:

Beispiel:

Honigtopf:           <input id="NameS34F" type="text" value="Name">
Sichtbares Textfeld: <input id="NameI769" type="text" value="Name" ...>

Honigtopf:           <input id="EMailS34F" type="text" value="E-Mail">
Sichtbares Textfeld: <input id="EMailI769" type="text" value="E-Mail" ...>

Nach Anklicken eines Buttons wird dann eine Funktion aufgerufen, in der ich u.a. die id's der einzelnen Textfelder entweder dem Array "Honigtoepfe" oder dem Array "Relevante_Felder" zuordne, je nach dem, welcher Buchstabe auf "Name" oder "EMail" folgt:

  
var Formular = document.getElementById("Newsletter"),  
    Alle_Eingabefelder = Formular.getElementsByTagName("input"),  
    x = 0,  
    Honigtoepfe = new Array(),  
    Relevante_Felder = new Array();  
  
for (; x < 2; x++)  
{  
   if (/(Name|EMail)(D|S|H|F|T)/.test(Alle_Eingabefelder[x].id) == true)  
      Honigtoepfe.push(Alle_Eingabefelder[x].id);  
  
   if (/(Name|EMail)(R|V|W|P|I)/.test(Alle_Eingabefelder[x].id) == true)  
      Relevante_Felder.push(Alle_Eingabefelder[x].id);  
}  

Lasse ich mir nun die beiden Arrays ausgeben, so ist die zweite id beider Arrays immer undefined:

HONIGTÖPFE:
-NameS34F
-undefined

RELEVANTE FELDER:
-NameI769
-undefined

Was habe ich bei der Zuordnung falsch gemacht?

Der Vollständigkeit halber sei erwähnt, dass ich Validierungen mittels php auch noch vornehmen werde, sobald das eben beschriebene fehlerhafte Verhalten funktioniert.

Vielen lieben Dank für eure Hilfe und Gruß,
Enrico

  1. Mahlzeit,

    Der Vollständigkeit halber sei erwähnt, dass ich Validierungen mittels php auch noch vornehmen werde, sobald das eben beschriebene fehlerhafte Verhalten funktioniert.

    Würde es dann nicht reichen, wenn du die Felder komplett in PHP prüfst? Dann sparst du dir das Javascript und Clients, die kein Javascript können/dürfen haben kein Problem.

    Ansonsten wäre ein Fiddle gut, damit man das selbst ausprobieren kann :)

    --
    42
    1. Hallo M,

      danke für Deine Antwort.

      Ich möchte den eingegebenen Namen und die eingegebene E-Mail-Adresse verschlüsselt an php übergeben und dies nur dann, wenn die Honigtopf-Felder nicht ausgefüllt wurden.

      Deswegen der "Umweg" über JavaScript. Und da bietet es sich ja auch gleich an, auf Spam zu prüfen.

      Gruß,
      Enrico

  2. Hi,

    for (; x < 2; x++)
    {
       if (/(Name|EMail)(D|S|H|F|T)/.test(Alle_Eingabefelder[x].id) == true)
          Honigtoepfe.push(Alle_Eingabefelder[x].id);

    if (/(Name|EMail)(R|V|W|P|I)/.test(Alle_Eingabefelder[x].id) == true)
          Relevante_Felder.push(Alle_Eingabefelder[x].id);
    }

      
    du lässt deine Schleife nur zwei mal durchlaufen, so können nur die ersten beiden inputs verarbeitet werden, also die beiden Name-Einträge.  
      
    Grüße, count
    
    1. Hallo count,

      so können nur die ersten beiden inputs verarbeitet werden, also die beiden Name-Einträge.

      Danke für Deine Hilfe! Das war's!

      Welch ein dummer Denkfehler von mir...

      Gruß,
      Enrico

  3. Moin,

    for (; x < 2; x++)

    du bearbeitest also die ersten zwei vorkommenden Eingabefelder, mehr nicht.

    Lasse ich mir nun die beiden Arrays ausgeben, so ist die zweite id beider Arrays immer undefined:

    HONIGTÖPFE:
    -NameS34F
    -undefined

    RELEVANTE FELDER:
    -NameI769
    -undefined

    Und das wundert dich? Es sind insgesamt zwei Einträge da, in jedem Array einer. Wo soll mehr herkommen?

    if (/(Name|EMail)(D|S|H|F|T)/.test(Alle_Eingabefelder[x].id) == true)

    if (/(Name|EMail)(R|V|W|P|I)/.test(Alle_Eingabefelder[x].id) == true)

      
    Und es ist zwar nicht falsch, aber auch nicht sinnvoll, boolsche Werte nochmal explizit auf true zu vergleichen, um als Ergebnis des Vergleichs wieder denselben Wert zu bekommen. Das macht's nur schwieriger zu lesen.  
      
    Schönen Sonntag noch,  
     Martin  
    
    -- 
    F: Was sagt der große Keks zum kleinen Keks?  
    A: Du kannst dich jetzt verkrümeln.  
    Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
    
    1. Hallo Martin,

      den Fehler habe ich dank Count beseitigen können, Deinen Hinweis auf unnötige doppelte Prüfung auf true habe ich auch gleich umgesetzt.

      Danke und Gruß,
      Enrico