Pouvez-vous utiliser un caractère générique dans getElementById?

J'ai la ligne de code suivante:

document.getElementById("question_*").setAttribute("disabled", "false"); 

Je souhaite utiliser une forme de caractère générique pour l'ID de l'élément. Le script est exécuté et utilisé par beaucoup de boutons différents, ils ont tous des ID de question_ something – est-il possible de faire cette setAttribute pour rendre le bouton activé pour différentes ID?

 <button id="question_1a" onClick="nextQuestion(this.id)" disabled>Next question</button> 

MODIFIER:

J'ai suggéré un nom de classe. Les boutons sont maintenant:

 <button id="question_1a" class="nextButton" disabled>Next question</button> 

J'ai ajouté la ligne suivante pour la rendre non désactivée:

 var elems = document.getElementsByClassName('nextButton').setAttribute("disabled", "false"); 

Mais je reçois: Uncaught TypeError: Object # n'a pas de méthode 'setAttribute'

Vous ne pouvez pas utiliser de caractères génériques avec document.getElementById() , mais vous pouvez , avec document.querySelectorAll() :

 var elems = document.querySelectorAll('button[id^="question_"]'); 

Ceci, bien sûr, nécessite un navigateur relativement à jour; D'autre part, utiliser un nom de classe (par exemple une question ) pour associer ces éléments vous permettrait d'utiliser:

 var elems = document.getElementsByClassName('question'); 

Ou:

 var elems = document.querySelectorAll('button.question'); 

J'ai essayé de faire ceci: var elems = document.getElementsByClassName('nextButton').setAttribute("disabled", "false"); – mais je reçois: Uncaught TypeError: Object # n'a pas de méthode 'setAttribute'

C'est parce que vous ne pouvez pas modifier les propriétés d'un NodeList tout à la fois, vous pouvez, cependant, utiliser une boucle for (){...} , ou similaire pour le faire:

Utilisation for(){...} :

 var elems = document.getElementsByClassName('question'); for (var i = 0, len = elems.length; i < len; i++){ elems[i].disabled = false; // to make them all enabled } 

Démo de JS Fiddle .

Ou en utilisant pour tout (navigateurs à jour):

 var elems = document.getElementsByClassName('question'); [].forEach.call(elems, function(a){ a.disabled = false; // will make all elements enabled }); 

Démo de JS Fiddle .

Les références:

  • Array.prototype.forEach() .
  • Sélecteurs d'attributs CSS .
  • document.getElementById() .
  • document.getElementsByClassName() .
  • document.querySelector() compatibilité .
  • document.querySelectorAll() compatibilité .
  • Function.prototype.call() .
  • JavaScript for boucle .

C'est précisément pour ce que sont les cours:

 <button class="question" id="question_1a" onClick="nextQuestion(this.id)" disabled>Next question</button> 

Et

 var elems = document.getElementsByClassName("question"); for(var z=0;z<elems.length; z++){ elems[z].setAttribute("disabled", "false") } 

Une autre possibilité, si querySelectorAll ou getElementsByClassName (pourrait être effacé d'une manière similaire) n'était pas disponible et vous vouliez faire correspondre plusieurs ID.

HTML

 <button>Question</button> <button id="question_1a">Question</button> <button id="question_1b">Question</button> <button id="question_1c">Question</button> <button id="question_1d">Question</button> <button id="question_2a">Question</button> 

Javascript

 function getElementsById(regex) { var tags = document.getElementsByTagName('*'), tagsLength = tags.length, matches = [], index, tag; for (index = 0; index < tagsLength; index += 1) { tag = tags[index]; if (regex.test(tag.id)) { matches.push(tag); } } return matches; } console.log(getElementsById(/^question_1[az]?$/)); 

Sortie

 [Bouton # question_1a, bouton # question_1b, bouton # question_1c, bouton # question_1d]

Sur jsFiddle

Ensuite, vous pouvez itérer ce tableau et définir les attributs

Et la getElementsByclassName

 function getElementsByClassName(node, className) { var array = [], regex = new RegExp("(^| )" + className + "( |$)"), elements = node.getElementsByTagName("*"), length = elements.length, i = 0, element; while (i < length) { element = elements[i]; if (regex.test(element.className)) { array.push(element); } i += 1; } return array; } 

Le curseur non utilisé n'est pas pris en charge. Mais pour résoudre ce problème, vous pouvez utiliser jQuery pour faire de même.

PS J'essaierai de poster un code une fois que je serai de retour au bureau

Mettre à jour l' avis de code de David Thomas et Beemo qui devrait résoudre votre problème

Vous pouvez utiliser le sélecteur JQuery $("[id^='question_']") pour obtenir tous les éléments avec un identifiant commençant par question_