Obtener el texto de la opción seleccionada con JavaScript

124

Tengo una lista desplegable como esta:

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

¿Cómo puedo obtener el texto de la opción real en lugar del valor usando JavaScript? Puedo obtener el valor con algo como:

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

Pero en lugar de lo 7122que quiero cat.

teatro tecnológico
fuente
2
stackoverflow.com/a/1085810/1339473 vea esto para obtener más ayuda
QuokMoon
posible duplicado de ¿Cómo obtener el valor seleccionado de la lista desplegable usando JavaScript? - a pesar del título, responde a tu pregunta.
Felix Kling

Respuestas:

226

Probar opciones

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>

999k
fuente
28
Primera regla al intentar usar expresiones regulares: siga buscando Stack Overflow hasta que vea la solución que no necesita
expresiones regulares
2
Es más limpio escribir sobre el cambio sin c mayúscula
Simon Baars
93

JavaScript simple

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

jQuery:

$("#box1 option:selected").text();
Sasi
fuente
1
@mplungjan ¿Por qué no comenta aquí que jQuery usa .textContenty .innerTextpara la .text()operación del método? No es por estándares, está totalmente equivocado porque no se usa .text. ¿Dónde están los votos negativos?
VisioN
¿Dónde está el innerHTML?
mplungjan
@mplungjan No lo es innerHTML, innerTextes aún peor.
VisioN
Veo la opción: {get: function (elem) {var val = elem.attributes.value; return! val || val.especificado? elem.value: elem.text;} en 1.9
mplungjan
15

Todas estas funciones y cosas aleatorias, creo que es mejor usar esto y hacerlo así:

this.options[this.selectedIndex].text
klidifia
fuente
6

HTML:

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

JavaScript:

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

DEMO: http://jsfiddle.net/6dkun/1/

Visión
fuente
vea este comentario
Eliminé
3

Utilizar -

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

Aquí está el violín: http://jsfiddle.net/eEGr3/

Ashwin
fuente
2
¿Dónde menciona la pregunta jQuery?
mplungjan
1

Deberá obtener el innerHTML de la opción, y no su valor.

Utilizar en this.innerHTMLlugar de this.selectedIndex.

Editar: primero deberá obtener el elemento de opción y luego usar innerHTML.

Utilizar en this.textlugar de this.selectedIndex.

Nick Pickering
fuente
Esto está mal. Será el grap innerHTMLde <select>elemento.
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

Pero :

 <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"

Y también esto:

 <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
fuente
1

Hay dos soluciones, hasta donde yo sé.

ambos que solo necesitan usar javascript vanilla

1 opciones seleccionadas

demo en vivo

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 opciones

demo en vivo

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
fuente
-1

Prueba lo siguiente:

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

Vea aquí la muestra de jsfiddle

ericosg
fuente
1
¿Por qué todos insisten en innerHTML ??? Utilice .text! Y por qué pasar todo eso a la función. Simplemente pase (esto) y
haga
Eh, creo que podría ser mejor / más rápido, pero me gustaría escuchar la refutación de @ mplungjan.
Nick Pickering
1
innerHTML es un método de conveniencia inventado por Microsoft. Luego se copió en más navegadores, pero dado que a) no es estándar yb) no puede tener html en una opción, no hay absolutamente ninguna necesidad de confundir el problema cuando una opción tiene .value y .text
mplungjan
innerHTMLSin embargo, es muy conveniente ... Estoy dispuesto a sacrificar todos los estándares y la simplicidad por eso. : P
Nick Pickering
1
personalmente uso .text () con jQuery y .innerHTML con JS puro y me ayuda a evitar errores al mezclar marcos de trabajo, solo por hábito. Sé que innerHTML funciona en todos los navegadores y eso me hace feliz :) Ah, y especifiqué ambos parámetros de función para que el OP pueda relacionarse más fácilmente con mi solución, sin otra razón.
ericosg