Je suis assez nouveau dans le développement Web, j'essaie de créer plusieurs boutons dans une fonction javascript et de définir leur fonction onclick dans une boucle for.
Ce que je veux: Lorsque je clique sur le bouton, je souhaite récupérer la valeur associée à ce bouton.
Ce que j'ai: Lorsque je clique sur un bouton, je récupère la valeur associée au dernier bouton.
J'ai fait un exemple simple de ce que j'essaie de faire:
HTML:
const data = [1, 2, 3, 4, 5]; var i; for (i = 0;i < data.length;i++) { const root = document.createElement('button'); root.setAttribute("class", "exerciceBox"); root.textContent = i; root.onclick = function() { console.log(i); } document.getElementById("container").append(root); }
JS:
<html> <body> <div id="container"> </div> <script src="script.js" charset="utf-8"></script> </body> </html>
Je ne sais pas s'il existe un meilleur moyen de déclarer la fonction .onclick pour le bouton créé dans des fichiers JS ou peut-être une autre façon de le faire.
J'espère que vous pourrez m'aider! Merci d'avance, Sincèrement, Valentin
5 Réponses :
Les index commencent à 0 dans js.
const data = [1, 2, 3, 4, 5]; for (let i = 0; i < data.length; i++) { const root = document.createElement('button'); root.setAttribute("class", "exerciceBox"); root.textContent = i; root.onclick = function() { console.log(i++); // this prints out i (index) + 1 } document.getElementById("container").append(root); }
Le problème réside dans l'instruction var et il y a un problème de portée. L'instruction var déclare une variable à portée fonction ou à portée globale. Pour résoudre ce problème, déclarez la variable i
par l'instruction let pour maintenir la portée dans la boucle for.
Une solution possible comme ci-dessous
p>
<html> <body> <div id="container"> </div> <script src="script.js" charset="utf-8"></script> </body> </html>
const data = [1, 2, 3, 4, 5]; for (let i = 0;i < data.length;i++) { const root = document.createElement('button'); root.setAttribute("class", "exerciceBox"); root.textContent = i; root.onclick = function() { console.log(i); } document.getElementById("container").append(root); }
Vous obtenez toujours la dernière valeur de i car le for l'incrémente jusqu'à la fin de la boucle, puis, lorsque vous cliquez sur le bouton, vous voyez la valeur incrémentée. Essayez ceci:
for (let i = 0; i < data.length; i++) { const root = document.createElement('button'); root.setAttribute("class", "exerciceBox"); root.textContent = i; let thisButtonI = i; //Make a copy of the actual value of i root.onclick = function() { console.log(thisButtonI); //use the copy, not the original i } document.getElementById("container").append(root); }
vous devez ajouter un attribut de valeur à vos boutons, voici comment procéder:
const data = [1, 2, 3, 4, 5]; for (i = 0;i < data.length;i++) { const root = document.createElement('button'); root.setAttribute("class", "exerciceBox"); // set the value of your button to i root.setAttribute("value", i); root.textContent = i; root.onclick = function() { // get the value using 'this' console.log(this.value); } document.getElementById("container").append(root); }
Voici une meilleure solution sur la façon de créer une série d'éléments à partir d'un tableau et de les insérer dans le DOM
EL_dataItem
) et attribuez les attributs et gestionnaires d'événements nécessaires Array.prototype.reduce ()
pour réduire votre data
Array en une collection DocumentFragment . API DocumentFragment
et sa méthode .append ()
Element. append ()
pour insérer les boutons là où c'est nécessaire - tous à la fois .
<div id="container"></div>
// Helpers const ELNew = (sel, attr) => Object.assign(document.createElement(sel), attr || {}); const EL = (sel, EL) => (EL || document).querySelector(sel); // Your data Array const data = [1, 2, 3, 4, 5]; // Button Blueprint const EL_dataItem = (item) => ELNew("button", { type: "button", className: "exerciceBox", // cice?.. textContent: item, onclick() { console.log(item); }, }); // Create all buttons (Append into DocumentFragment) const DF_items = data.reduce((DF, item) => { DF.append(EL_dataItem(item)); return DF; }, new DocumentFragment()); // Append DocumentFragment once. EL("#container").append(DF_items);