1

Je crée un formulaire dynamiquement avec JS simple. Chaque fois que le dernier champ d'entrée reçoit une entrée, il faut en créer une autre vide. D'un autre côté, le dernier champ doit être supprimé lorsque l'avant-dernier est également vide.L'événement est déclenché une seule fois lorsqu'il est appliqué à plusieurs éléments

HTML (avant d'entrée utilisateur):

<div id="eventList" class="gap"> 
     <input id="event1" class="text bold eventBox" type="text" name="event1" placeholder="Ereignis 1" /> <br> 
</div> 

Javascript (mis en œuvre par la suite, en extraits):

function addBox() { 

    var boxes = document.getElementsByClassName("eventBox"); 

    var id = +getMaxID(boxes, "event") + +1;   // ID of input being created 

    var list = document.getElementById("eventList"); 

    list.innerHTML = list.innerHTML + '<input id="event'+ id +'" class="text bold eventBox" type="text" name="event'+ id +'" placeholder="Ereignis '+ id +'" /> <br>'; 

    document.getElementById("event" + id).addEventListener("input", resizeEventList); 

} 

function delBox() { 

    loadTexts();    // save current inputs 

    var list = document.getElementById("eventList"); 

    document.getElementById("eventList").innerHTML = ''; 

    var id = 1; 

    for (var i = 1; i < eventTexts.length; i++) { 

     if (eventTexts[i].length > 0) { 

      /* recreate box with its former input (if not empty) */ 

      document.getElementById("eventList").innerHTML = document.getElementById("eventList").innerHTML + '<input id="event'+ id +'" class="text bold eventBox" type="text" name="event'+ id +'" placeholder="Ereignis '+ id +'" value="' + eventTexts[i] + '"/> <br>'; 
      document.getElementById("event" + id).addEventListener("input", resizeEventList); 

      id++; 

     } 

    } 

    /* add new last empty input */ 

    document.getElementById("eventList").innerHTML = document.getElementById("eventList").innerHTML + '<input id="event'+ id +'" class="text bold eventBox" type="text" name="event'+ id +'" placeholder="Ereignis '+ id +'" value=""/> <br>'; 
    document.getElementById("event" + id).addEventListener("input", resizeEventList); 

} 

function resizeEventList(e) { 

    if (typeof e != 'undefined') { 

     var boxes = document.getElementsByClassName("eventBox"); 

     if (e.target.id == "event"+getMaxID(boxes, "event") && e.type == 'input') { 

      /* input into last available box -> add an empty box */ 

       loadTexts();    // save current inputs 

       senderID = e.target.id;  // remember ID of triggering element for resetting focus afterwards 

       addBox();     // add another box 

       writeTexts();    // write former inputs back into boxes 

       document.getElementById(senderID).focus();  // reset focus 

     } else if (e.target.value.length == 0 && getID(e.target, "event") < getMaxID(boxes, "event")) { 

      /* box before last box empty -> delete last empty box */ 

       senderID = e.target.id;  // remember ID of triggering element for resetting focus afterwards 

       delBox();     // delete all boxes and create X new boxes 

       document.getElementById(senderID).focus();  // reset focus 

     } 

    } 

} 

var eventTexts = new Array(); 
var senderID; 
document.getElementById("event1").addEventListener("input", resizeEventList); 

Le problème maintenant: Quand je demande tous les auditeurs de l'événement uniquement à l'entrée appelée " event1 ", le code fonctionne comme prévu - en ajoutant une entrée lors de la frappe, en supprimant un lorsqu'il est vide, juste pour event1 seulement. Lorsque j'applique également les écouteurs d'événements aux entrées créées dynamiquement (comme il se doit et est écrit dans le code ci-dessus), l'événement d'entrée n'est déclenché qu'une seule fois à la première entrée, y compris event1. Toutes les entrées suivantes ne sont plus enregistrées.

Est-ce que quelqu'un a une solution?

Merci, Jaspa

--- CODE COMPLET --------------------

<form id="planForm" class="top-margin" method="post" action="new.php?action=add"> 

    <div> 
     <input class="text head bold" type="date" name="date" placeholder="Datum" value="<?php echo date("Y-m-d", time());?>" required /> <br> 

     <div id="eventList" class="gap"> 

      <input id="event1" class="text bold eventBox" type="text" name="event1" placeholder="Ereignis 1" /> <br> 

     </div> 
    </div > 

<input type="button" value="Speichern" onclick="save();"/> 

</form> 

<script> 

    function getID(elm, type) { 
     if (typeof elm != 'undefined') { 
      return elm.id.replace(type, ""); 
     } else { 
      return ""; 
     } 
    } 

    function getMaxID(list, type) { 

     currID = 0; 
     max = 0; 

     if (list != null && list.length > 0 && type != null) { 
      for (var i=0; i < list.length; i++) { 
       currID = getID(list[i], type); 
       if (currID > max) { 
        max = currID; 
       } 
      } 
     } 

     return max; 

    } 

    function addBox() { 

     var boxes = document.getElementsByClassName("eventBox"); 

     var id = +getMaxID(boxes, "event") + +1;   // ID of input being created 

     var list = document.getElementById("eventList"); 

     list.innerHTML = list.innerHTML + '<input id="event'+ id +'" class="text bold eventBox" type="text" name="event'+ id +'" placeholder="Ereignis '+ id +'" /> <br>'; 

     document.getElementById("event" + id).addEventListener("input", resizeEventList); 

     console.log(document.getElementById("event" + id)); 

    } 

    function delBox() { 

     loadTexts();    // save current inputs 

     var list = document.getElementById("eventList"); 

     document.getElementById("eventList").innerHTML = ''; 

     var id = 1; 

     for (var i = 1; i < eventTexts.length; i++) { 

      if (eventTexts[i].length > 0) { 

       /* recreate box with its former input (if not empty) */ 

       document.getElementById("eventList").innerHTML = document.getElementById("eventList").innerHTML + '<input id="event'+ id +'" class="text bold eventBox" type="text" name="event'+ id +'" placeholder="Ereignis '+ id +'" value="' + eventTexts[i] + '"/> <br>'; 
       document.getElementById("event" + id).addEventListener("input", resizeEventList); 

       id++; 

      } 

     } 

     /* add new last empty input */ 

     document.getElementById("eventList").innerHTML = document.getElementById("eventList").innerHTML + '<input id="event'+ id +'" class="text bold eventBox" type="text" name="event'+ id +'" placeholder="Ereignis '+ id +'" value=""/> <br>'; 
     document.getElementById("event" + id).addEventListener("input", resizeEventList); 

    } 

    function resizeEventList(e) { 

     if (typeof e != 'undefined') { 

      var boxes = document.getElementsByClassName("eventBox"); 

      if (e.target.id == "event"+getMaxID(boxes, "event") && e.type == 'input') { 

       /* input into last available box -> add an empty box */ 

        loadTexts();    // save current inputs 

        senderID = e.target.id;  // remember ID of triggering element for resetting focus afterwards 

        addBox();     // add another box 

        writeTexts();    // write former inputs back into boxes 

        document.getElementById(senderID).focus();  // reset focus 

      } else if (e.target.value.length == 0 && getID(e.target, "event") < getMaxID(boxes, "event")) { 

       /* box before last box empty -> delete last empty box */ 

        senderID = e.target.id;  // remember ID of triggering element for resetting focus afterwards 

        delBox();     // delete all boxes and create X new boxes 

        document.getElementById(senderID).focus();  // reset focus 

      } 

     } 

    } 

    function loadTexts() { 
     var boxes = document.getElementsByClassName("eventBox"); 

     for (var i=0; i < boxes.length; i++) { 
      eventTexts[getID(document.getElementById(boxes[i].id), "event")] = boxes[i].value; 
     } 
    } 

    function writeTexts() { 
     var boxes = document.getElementsByClassName("eventBox"); 

     for (var i=0; i < boxes.length-1; i++) { 
      document.getElementById(boxes[i].id).value = eventTexts[getID(boxes[i], "event")]; 
     } 
    } 

    var eventTexts = new Array(); 
    var senderID; 
    document.getElementById("event1").addEventListener("input", resizeEventList); 

</script> 
+0

Avez-vous déconnecté que vous obtenez réellement l'élément sur la page avant d'ajouter l'écouteur? – mhatch

+0

Oui, j'obtiens les ID corrects, mais seulement après la première entrée. D'autres entrées ne déclenchent pas du tout l'événement – Jaspa

+0

avez-vous vu si cela renvoyait l'élément? document.getElementById ("event" + id) –

Répondre

1

Pour tous ceux qui veulent connaître la solution:

utilisez "insertAdjacentHTML" au lieu de "innerHTML" pour créer des éléments de façon dynamique. Merci à RajeshP de donner un lien vers cette réponse utile: Javascript AddEventListener Fires only once