Problem mit "onclick" bei DOM erweiterung

  • Hallo Community,


    ich habe ein Formular erstellt, das soweit auch gut funktioniert. Jetzt wollte ich, dass wenn man auf einen Button drückt noch 4 weitere Eingabefelder an das Formular hin zugefügt werden.


    Hier soweit mein Code:



    Die Eingabefelder werden auch soweit an das Formular angefügt. (Das ich das einfach an den Body hänge, ist erstmal nur zu Testzwecken!
    Leider aber werden aber die Attribute "required" falsch in HTML überführt, es steht dann im Quellttext: required="" und nicht required="required", dazu kommt, dass onfocus überhaupt nicht übernommen wird.


    Muss man das anders Regeln, oder kann mir jemand aufzeigen wo mein Fehler liegt?


    Vielen Dank! :)

  • Herzlich willkommen in der Welt von JavaScript ;)


    Dein erstes Problem mit dem required Attribut ist kein wirkliches Problem, das Attribut wird gesetzt, jedoch nicht ausgefüllt, mit HTML5 ist das ausfüllen auch nicht nötig (wie das vorher war weiß ich derzeit nicht):


    HTML
    <!-- Quelle: w3schools -->
    <input type="text" name="usrname" required>


    Jedoch einfahc um es zu erwähnen: Du könntest nachdem du mit appendChild die Elemente angehängt hast einfach setAttribute nutzen:


    JavaScript
    document.getElementById(legungName).setAttribute("required", "required");


    Dein 2. Problem ist etwas komplexer aber mit einem einfachen Trick auch gelöst. Event-Listener an nachträglich erstellte DOM Elemente anhängen geht nicht einfach über das Einfügen in den HTML Code. Auch hier warten wir bis das Element mit appendChild angehängt wurde und nutzen dann die Funktion addEventListener:


    JavaScript
    document.getElementById(legungName).addEventListener("focus", function() { 
      updateLegung(m);
    });


    Der eigentliche Aufbau wäre:


    JavaScript
    element.addEventListener(TYPE, LISTENER [, useCapture, wantsUntrusted]);


    Wenn wir jedoch Werte an eine Funktion übergeben wollen müssen wir dies in einer anonymen Funktion tun, ansonsten wird der LISTENER ausgeführt sobald addEventListener ausgeführt wird.


    JavaScript
    // Wir erhalten sofort eine Alert Box mit dem Inhalt 1
    element.addEventListener("click", alert(1));


    Der Aufbau einer anonymen Funktion ist immer:


    JavaScript
    function() {
      // Code
    }


    Ich hoffe deine Fragen sind beantwortet, ansonsten melde dich gerne wieder :love:

  • Erstmal vielen Dank für die Antwort!


    Ich habe deine zwei Vorschläge mal in die Tat umgesetzt:



    Das steht jetzt am Ende meiner Funktion. Leider, wenn ich dann in Firefox die Elemente untersuche, finde ich weder das required Attribut, noch das onfocus.
    Könnte es sein, dass die Elemente noch nicht gesetzt sind, als er versucht denen etwas anzuhängen? Das ich dass vielleicht in eine extra Methode schreiben sollte?

  • Ich habe an deinen Code von oben das Gleiche angehängt wie du:



    Und bei mir sieht das im Firefox so aus:
    html-seminar.de/woltlab/attachment/608/


    onFocus kann nicht angezeigt werden, wir haben das Attribut nicht hinzugefügt, JavaScript überwacht das Event jetzt persönlich ;)

  • Und bei mir sieht das im Firefox so aus:
    html-seminar.de/woltlab/attachment/608/


    onFocus kann nicht angezeigt werden, wir haben das Attribut nicht hinzugefügt, JavaScript überwacht das Event jetzt persönlich ;)


    Jetzt klappt es auch bei mir mit dem required, hatte einen logischen Fehler in dem ich bei der ID vergabe der Eingabefelder, zwei mal die Nummer 1 vergeben hab^^


    Verstehe ich das jetzt richtig, dass bei:


    JavaScript
    document.getElementById(legungName).addEventListener("focus", function(){ 
    //updateLegung(m); 
    } 
    );


    er diesem Textfeld das onFocus Event überwacht, und falls dies aktiviert wird, dann die Funktion updateLegung(m) ausführt?
    (wobei in diesem fall m ja eine Variable ist, oder ist dass dann nicht möglich?)

  • Korrekt, diese Methode macht genau das Gleiche wie onFocus, jedoch ohne in den HTML Stammbaum eingreifen zu müssen. Du kannst in der anonymen Funktion ganz normal JavaScript ausführen, also auch Variablen an die Funktion übergeben.

  • Vielen Dank für deine Hilfe. Jetzt klappt es, aber ich musste noch etwas verändern, da nämlich:


    JavaScript
    document.getElementById(legungName).addEventListener("focus", function(){ 
    //updateLegung(m); 
    } 
    );


    bei mir nicht funktioniert hat. Aber wenn ich die Kommentierung entferne,


    JavaScript
    document.getElementById(legungName).addEventListener("focus", function(){ 
    updateLegung(m); 
    } 
    );


    klappt es wie es soll. :D

  • OM Manipulation ist mit jQuery übrigens um ein Vielfaches einfacher.

    Kann ich mir vorstellen. Aber ich fand als Einsteiger es einfacher mit Javascript, da ich dort es einfacher finde, die Logik zu verstehen. Bei jQuery ist mir das meist zu stark abgekürzt.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!