Отримайте вибраний текст опції за допомогою 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.