Obtenir le texte de l'option sélectionnée avec JavaScript


124

J'ai une liste déroulante comme celle-ci:

<select id="box1">
<option value="98">dog</option>
<option value="7122">cat</option>
<option value="142">bird</option>
</select>

Comment puis-je obtenir le texte de l'option réelle plutôt que la valeur à l'aide de JavaScript? Je peux obtenir la valeur avec quelque chose comme:

<select id="box1" onChange="myNewFunction(this.selectedIndex);" >

Mais plutôt que 7122je ne veux cat.


2
stackoverflow.com/a/1085810/1339473 voir ceci pour plus d'aide
QuokMoon

duplication possible de Comment obtenir la valeur sélectionnée de la liste déroulante en utilisant JavaScript? - malgré le titre, il répond à votre question.
Felix Kling

Réponses:


226

Essayez les options

function myNewFunction(sel) {
  alert(sel.options[sel.selectedIndex].text);
}
<select id="box1" onChange="myNewFunction(this);">
  <option value="98">dog</option>
  <option value="7122">cat</option>
  <option value="142">bird</option>
</select>


28
Première règle lorsque vous essayez d'utiliser une expression régulière - continuez à chercher Stack Overflow jusqu'à ce que vous voyiez la solution qui n'a pas besoin de regex
bravo

2
C'est plus propre d'écrire onchange sans majuscule c
Simon Baars

93

JavaScript simple

var sel = document.getElementById("box1");
var text= sel.options[sel.selectedIndex].text;

jQuery:

$("#box1 option:selected").text();

1
@mplungjan Pourquoi ne commentez-vous pas ici que jQuery utilise .textContentet .innerTextpour le .text()fonctionnement de la méthode? Ce n'est pas conforme aux normes, c'est totalement faux parce que cela n'utilise pas .text. Où sont les votes négatifs?
VisioN

Où est le innerHTML?
mplungjan

@mplungjan Ce n'est pas le cas innerHTML, innerTextc'est encore pire.
VisioN

Je vois l'option: {get: function (elem) {var val = elem.attributes.value; retour! val || val.specified? elem.value: elem.text;} in 1.9
mplungjan

15

Toutes ces fonctions et choses aléatoires, je pense qu'il est préférable d'utiliser ceci, et de le faire comme ceci:

this.options[this.selectedIndex].text



1

Vous aurez besoin d'obtenir le innerHTML de l'option, et non sa valeur.

Utilisez à la this.innerHTMLplace de this.selectedIndex.

Edit: Vous devrez d'abord obtenir l'élément option, puis utiliser innerHTML.

Utilisez à la this.textplace de this.selectedIndex.


C'est faux. Il grap le innerHTMLd' <select>élément.
VisioN

1
 <select class="cS" onChange="fSel2(this.value);">
     <option value="0">S?lectionner</option>
     <option value="1">Un</option>
     <option value="2" selected>Deux</option>
     <option value="3">Trois</option>
 </select>

 <select id="iS1" onChange="fSel(options[this.selectedIndex].value);">
     <option value="0">S?lectionner</option>
     <option value="1">Un</option>
     <option value="2" selected>Deux</option>
     <option value="3">Trois</option>
 </select><br>

 <select id="iS2" onChange="fSel3(options[this.selectedIndex].text);">
     <option value="0">S?lectionner</option>
     <option value="1">Un</option>
     <option value="2" selected>Deux</option>
     <option value="3">Trois</option>
 </select>

 <select id="iS3" onChange="fSel3(options[this.selectedIndex].textContent);">
     <option value="0">S?lectionner</option>
     <option value="1">Un</option>
     <option value="2" selected>Deux</option>
     <option value="3">Trois</option>
 </select>

 <select id="iS4" onChange="fSel3(options[this.selectedIndex].label);">
     <option value="0">S?lectionner</option>
     <option value="1">Un</option>
     <option value="2" selected>Deux</option>
     <option value="3">Trois</option>
 </select>

 <select id="iS4" onChange="fSel3(options[this.selectedIndex].innerHTML);">
     <option value="0">S?lectionner</option>
     <option value="1">Un</option>
     <option value="2" selected>Deux</option>
     <option value="3">Trois</option>
 </select>

 <script type="text/javascript"> "use strict";
   const s=document.querySelector(".cS");

 // options[this.selectedIndex].value
 let fSel = (sIdx) => console.log(sIdx,
     s.options[sIdx].text, s.options[sIdx].textContent, s.options[sIdx].label);

 let fSel2= (sIdx) => { // this.value
     console.log(sIdx, s.options[sIdx].text,
         s.options[sIdx].textContent, s.options[sIdx].label);
 }

 // options[this.selectedIndex].text
 // options[this.selectedIndex].textContent
 // options[this.selectedIndex].label
 // options[this.selectedIndex].innerHTML
 let fSel3= (sIdx) => {
     console.log(sIdx);
 }
 </script> // fSel

Mais :

 <script type="text/javascript"> "use strict";
    const x=document.querySelector(".cS"),
          o=x.options, i=x.selectedIndex;
    console.log(o[i].value,
                o[i].text , o[i].textContent , o[i].label , o[i].innerHTML);
 </script> // .cS"

Et aussi ceci:

 <select id="iSel" size="3">
     <option value="one">Un</option>
     <option value="two">Deux</option>
     <option value="three">Trois</option>
 </select>


 <script type="text/javascript"> "use strict";
    const i=document.getElementById("iSel");
    for(let k=0;k<i.length;k++) {
        if(k == i.selectedIndex) console.log("Selected ".repeat(3));
        console.log(`${Object.entries(i.options)[k][1].value}`+
                    ` => ` +
                    `${Object.entries(i.options)[k][1].innerHTML}`);
        console.log(Object.values(i.options)[k].value ,
                    " => ",
                    Object.values(i.options)[k].innerHTML);
        console.log("=".repeat(25));
    }
 </script>

1

Il existe deux solutions, pour autant que je sache.

les deux qui ont juste besoin d'utiliser du javascript vanille

1 options sélectionnées

démo en direct

const log = console.log;
const areaSelect = document.querySelector(`[id="area"]`);

areaSelect.addEventListener(`change`, (e) => {
  // log(`e.target`, e.target);
  const select = e.target;
  const value = select.value;
  const desc = select.selectedOptions[0].text;
  log(`option desc`, desc);
});
<div class="select-box clearfix">
  <label for="area">Area</label>
  <select id="area">
    <option value="101">A1</option>
    <option value="102">B2</option>
    <option value="103">C3</option>
  </select>
</div>

2 options

démo en direct

const log = console.log;
const areaSelect = document.querySelector(`[id="area"]`);

areaSelect.addEventListener(`change`, (e) => {
  // log(`e.target`, e.target);
  const select = e.target;
  const value = select.value;
  const desc = select.options[select.selectedIndex].text;
  log(`option desc`, desc);
});
<div class="select-box clearfix">
  <label for="area">Area</label>
  <select id="area">
    <option value="101">A1</option>
    <option value="102">B2</option>
    <option value="103">C3</option>
  </select>
</div>



-1

Essayez ce qui suit:

myNewFunction = function(id, index) {
    var selection = document.getElementById(id);
    alert(selection.options[index].innerHTML);
};

Voir ici l' exemple jsfiddle


1
Pourquoi tout le monde insiste-t-il sur innerHTML ??? Utilisez .text! Et pourquoi passer tout ça à la fonction.
Passez

Eh, je pense que ça pourrait être mieux / plus rapide mais j'aimerais entendre la réfutation de @ mplungjan.
Nick Pickering

1
innerHTML est une méthode pratique inventée par Microsoft. Il a ensuite été copié dans plus de navigateurs, mais comme a) ce n'est pas standard et b) vous ne pouvez pas avoir de html dans une option, il n'est absolument pas nécessaire de confondre le problème lorsqu'une option a .value et .text
mplungjan

innerHTMLest si pratique cependant ... Je suis prêt à sacrifier toutes les normes et la simplicité pour cela. : P
Nick Pickering

1
Personnellement, j'utilise .text () avec jQuery et .innerHTML avec du JS pur et m'aide à éviter les erreurs lors du mixmatching des frameworks, uniquement par habitude. Je sais que innerHTML fonctionne dans tous les navigateurs et cela me rend heureux :) oh et j'ai spécifié les deux paramètres de fonction afin que l'OP puisse se rapporter plus facilement à ma solution, aucune autre raison.
ericosg
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.