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.

techtheatre
la source
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>

999 000
la source
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();
sasi
la source
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
Klidifia
la source
6

HTML:

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

JavaScript:

function myNewFunction(element) {
    var text = element.options[element.selectedIndex].text;
    // ...
}

DÉMO: http://jsfiddle.net/6dkun/1/

Vision
la source
voir ce commentaire J'ai supprimé notre conversation depuis que vous avez corrigé votre code
mplungjan
3

Utilisation -

$.trim($("select").children("option:selected").text())   //cat

Voici le violon - http://jsfiddle.net/eEGr3/

Ashwin
la source
2
Où la question mentionne-t-elle jQuery?
mplungjan
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.

Nick Pickering
la source
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>
Jean-Dadet Diasoluka
la source
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>


xgqfrms
la source
-1

Essayez ce qui suit:

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

Voir ici l' exemple jsfiddle

ericosg
la source
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