Existe-t-il un moyen de simplifier le code ci-dessous en utilisant un tableau? Par exemple, lorsque le bouton 1 (avec l'index 0) dans le HTML est cliqué, cela pourrait-il être utilisé pour obtenir une valeur à l'index 0 dans un autre tableau?
<button onclick="f1()">no.1</button> <button onclick="f2()">no.2</button> <button onclick="f3()">no.3</button> <button onclick="f4()">no.4</button> <p id="dis"></p>
function f1() {
document.getElementById("dis").innerHTML = "JoeMae";
}
function f2() {
document.getElementById("dis").innerHTML = "TanakaMae";
}
function f3() {
document.getElementById("dis").innerHTML = "James";
}
function f4() {
document.getElementById("dis").innerHTML = "Deus";
}
5 Réponses :
Utilisez un autre tableau tel que le nième index de ce tableau corresponde au nième bouton:
<button>no.1</button> <button>no.2</button> <button>no.3</button> <button>no.4</button> <p id="dis"></p>
const texts = [
"JoeMae",
"TanakaMae",
"James",
"Deus"
];
const dis = document.getElementById("dis");
document.querySelectorAll('button').forEach((button, i) => {
button.addEventListener('click', () => {
dis.textContent = texts[i];
});
});
Notez qu'à moins que vous n'insériez délibérément du balisage HTML, vous devriez probablement utiliser textContent , pas innerHTML . ( textContent est plus rapide et plus sûr)
Vous pouvez simplifier sans utiliser le tableau:
function f(str) {
document.getElementById("dis").innerHTML = str;
}
<button onclick="f('JoeMae')">no.1</button>
<button onclick="f('TanakaMae')">no.2</button>
<button onclick="f('James')">no.3</button>
<button onclick="f('Deus')">no.4</button>
<p id="dis"></p>
que signifie str?
cela signifie "toute chaîne que vous pouvez mettre en argument"
@maetanaka str est juste le nom de cet argument de fonction, vous pouvez l'appeler comme vous voulez
Les gestionnaires en ligne ne sont presque jamais souhaitables, voir w3.org/wiki/The_principles_of_unobtrusive_JavaScript . Cela entraîne également un code très répétitif lorsqu'il y a beaucoup de boutons
Voici un exemple légèrement plus clair et plus flexible de la manière d'implémenter ce type de fonctionnalité.
Si vous disposez de nombreuses fonctionnalités de rendu comme celle-ci, je vous recommande cependant d'utiliser une bibliothèque / un framework pour cela.
/ p>
<div id="buttonContainer"></div> <div id="resultContainer"></div>
const buttonDefinitions = [
{title: 'no.1', name: 'Monica'},
{title: 'no.2', name: 'Erica'},
{title: 'no.3', name: 'Rita'},
{title: 'no.4', name: 'Tina'}
];
const buttonContainer = document.getElementById('buttonContainer');
const resultContainer = document.getElementById('resultContainer');
for (const buttonDefinition of buttonDefinitions) {
const button = document.createElement('button');
button.innerHTML = buttonDefinition.title;
button.onclick = () => {
resultContainer.innerHTML = buttonDefinition.name;
};
buttonContainer.appendChild(button);
}
Quel est le but d'utiliser l'IIFE ici?
Vous avez tout à fait raison, cela n'a aucune utilité immédiate dans ce cas. Je l'ai enlevé.
Vous pouvez passer l'élément à la fonction et accéder aux attributs de données de l'élément Dans l'exemple ci-dessous, je transmets data-name
<button data-name="JoeMae" onclick="f(this)">no.1</button> <button data-name="TanakaMae" onclick="f(this)">no.2</button> <button data-name="James" onclick="f(this)">no.3</button> <button data-name="Deus" onclick="f(this)">no.4</button> <p id="dis"></p>
function f(element) {
document.getElementById("dis").innerHTML = element.dataset["name"];
}
Voici une approche qui est JS vanille. J'ai utilisé l'API dataset pour connecter chaque bouton à ses données, puis un seul gestionnaire pour récupérer et afficher ces données.
<p id='dis'></p>
"use strict";
function byId(id){return document.getElementById(id)}
function newEl(tag){return document.createElement(tag)}
window.addEventListener('load', onLoaded, false);
function onLoaded(evt)
{
var responseArray = ['JoeMae', 'TanakaMae', 'James', 'Deus'];
responseArray.forEach( function(arrElem, elemIndex, arr)
{
var btn = newEl('button');
btn.textContent = `no.${elemIndex+1}`;
btn.dataset.response = arrElem;
btn.addEventListener('click', onClick, false);
document.body.appendChild(btn);
}
);
function onClick(evt)
{
let text = this.dataset.response;
byId('dis').textContent = text;
}
}
dois-je installer des dépendances ici ou non?
Non, il n'y en a pas. Juste un nouveau navigateur exécutant JS.
Vous pouvez utiliser une boucle de commutation et appliquer
addEventListeneraudocument.getElementById ();et appliquer le même ID à tous les boutons (pas très fiable, car les ID sont supposés être "unique") oudocument.getElementsByClass ();et appliquer la même classe aux boutons (meilleure approche)