Отримайте вибраний текст опції за допомогою JavaScript


124

У мене такий список випадає:

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

Як я можу отримати фактичний текст опції, а не значення за допомогою JavaScript? Я можу отримати значення приблизно таким чином:

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

Але швидше, ніж 7122я хочу cat.


2
stackoverflow.com/a/1085810/1339473 див. для отримання додаткової допомоги
QuokMoon

можливий дублікат Як отримати вибране значення випадаючого списку за допомогою JavaScript? - незважаючи на назву, він відповідає на ваше запитання.
Фелікс Клінг

Відповіді:


227

Спробуйте варіанти

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
Перше правило, коли намагаєтесь використовувати регулярний вираз - продовжуйте шукати переповнення стека, поки не з’явиться рішення, яке не потребує регулярного вираження - ура :)
Mirror318

2
Чистіше писати на зміні без великої літери c
Simon Baars

93

Простий JavaScript

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

jQuery:

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

1
@mplungjan Чому ви не коментуєте тут, що jQuery використовує .textContentта .innerTextдля .text()роботи методу? Це не за стандартами, це абсолютно неправильно, оскільки він не використовує .text. Де знаходяться низовини?
VisioN

Де внутрішнійHTML?
mplungjan

@mplungjan Це не так innerHTML, innerTextще гірше.
VisioN

Я бачу варіант: {get: function (elem) {var val = elem.attributes.value; повернення! val || val.specified? elem.value: elem.text;} в 1.9
mplungjan

15

Всі ці функції та випадкові речі, я вважаю, що найкраще це використовувати, і робити це так:

this.options[this.selectedIndex].text



1

Вам потрібно буде отримати внутрішнійHTML опції, а не його значення.

Використовуйте this.innerHTMLзамість this.selectedIndex.

Редагувати: Вам потрібно спочатку отримати елемент опції, а потім використовувати innerHTML.

Використовуйте this.textзамість this.selectedIndex.


Це неправильно. Він грейфери innerHTMLз <select>елемента.
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

Але:

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

А також це:

 <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

Наскільки я знаю, є два рішення.

обидва, які просто потребують використання ванільного javascript

1 вибраніОпції

жива демонстрація

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 варіанти

жива демонстрація

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

Спробуйте нижче:

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

Дивіться тут зразок jsfiddle


1
Чому всі наполягають на внутрішнійHTML ??? Використовуйте .text! І навіщо передавати все це на функцію. Просто перейдіть (це) і функція вирішить, що використовувати
mplungjan

Е, я думаю, що це може бути краще / швидше, але я хотів би почути спростування @ mplungjan.
Нік Пікерінг

1
innerHTML - це зручний метод, винайдений Microsoft. Потім він був скопійований у більше браузерів, але оскільки а) це не стандартно; б) ви не можете мати html в опції, абсолютно не потрібно плутати проблему, коли параметр має .value та .text
mplungjan

innerHTMLЦе так зручно, хоча ... Я готовий пожертвувати всіма стандартами та простотою для цього. : P
Нік Пікерінг

1
особисто я використовую .text () з jQuery та .innerHTML з чистим JS та допомагає мені уникати помилок при змішуванні рамок, лише за звичкою. Я знаю, що innerHTML працює у всіх браузерах, і це мене радує :) о, і я вказав обидва параметри функції, щоб ОП міг легше ставитися до мого рішення, без іншої причини.
ericosg
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.