Зміна вибраного параметра елемента Select HTML


148

У моєму HTML я маю <select>три <option>елементи. Я хочу використовувати jQuery, щоб перевірити значення кожного параметра на Javascript var. Якщо один відповідає, я хочу встановити вибраний атрибут цієї опції. Як би я це зробив?


Опублікуйте свій HTML. Але звичайним чином:$('#myselectid').val()
Саміч

9
Не впевнений, чому його прихильнили, він новий користувач, і питання здається законним.
vol7ron

Відповіді:


323

Ванільний JavaScript

Використання старого простого JavaScript:

var val = "Fish";
var sel = document.getElementById('sel');
document.getElementById('btn').onclick = function() {
  var opts = sel.options;
  for (var opt, j = 0; opt = opts[j]; j++) {
    if (opt.value == val) {
      sel.selectedIndex = j;
      break;
    }
  }
}
<select id="sel">
    <option>Cat</option>
    <option>Dog</option>
    <option>Fish</option>
</select>
<button id="btn">Select Fish</button>

jQuery

Але якщо ви дійсно хочете використовувати jQuery:

var val = 'Fish';
$('#btn').on('click', function() {
  $('#sel').val(val);
});

jQuery - Використання атрибутів значення

Якщо ваші параметри мають значення атрибутів, які відрізняються від їх текстового вмісту, і ви хочете вибрати за допомогою текстового вмісту:

<select id="sel">
    <option value="1">Cat</option>
    <option value="2">Dog</option>
    <option value="3">Fish</option>
</select>
<script>
    var val = 'Fish';
    $('#sel option:contains(' + val + ')').prop({selected: true});
</script>

Демо

Але якщо у вас встановлено вище, і ви хочете вибрати за значенням, використовуючи jQuery, ви можете зробити так, як і раніше:

var val = 3;
$('#sel').val(val);

Сучасний DOM

Для веб-переглядачів, які підтримують document.querySelectorі HTMLOptionElement::selectedвластивість, це більш стислий спосіб виконання цього завдання:

var val = 3;    
document.querySelector('#sel [value="' + val + '"]').selected = true;

Демо

Knockout.js

<select data-bind="value: val">
    <option value="1">Cat</option>
    <option value="2">Dog</option>
    <option value="3">Fish</option>
</select>
<script>
    var viewModel = {
        val: ko.observable()
    };
    ko.applyBindings(viewModel);
    viewModel.val(3);
</script>

Демо

Полімер

<template id="template" is="dom-bind">
    <select value="{{ val }}">
        <option value="1">Cat</option>
        <option value="2">Dog</option>
        <option value="3">Fish</option>
    </select>
</template>
<script>
    template.val = 3;
</script>

Демо

Кутовий 2

Примітка. Це не оновлено для остаточного стабільного випуску.

<app id="app">
    <select [value]="val">
        <option value="1">Cat</option>
        <option value="2">Dog</option>
        <option value="3">Fish</option>
    </select>
</app>
<script>
    var App = ng.Component({selector: 'app'})
        .View({template: app.innerHTML})
        .Class({constructor:  function() {}});

    ng.bootstrap(App).then(function(app) {
        app._hostComponent.instance.val = 3;
    });
</script>

Демо

Vue 2

<div id="app">
    <select v-model="val">
        <option value="1">Cat</option>
        <option value="2">Dog</option>
        <option value="3">Fish</option>
    </select>
</div>
<script>
    var app = new Vue({
        el: '#app',
        data: {
                val: null,
        },
        mounted: function() {
                this.val = 3;
        }
    });
</script>

Демо


1
Це було особливо корисно, оскільки я не знав, як встановити вибраний атрибут. Я не здогадувався, що існує обраний Індeкс. Дякую.
llihttocs

1
@aelgoa jsperf.com/option-select-loop/2 Я виправив ваш перший фрагмент, щоб більше імітувати мій код, що робить мій повільніше. Я використовував пост-інкремент замість попереднього збільшення, а потім додав ще один тест, який трохи швидше, ніж ваш 3-й тест.
кж

1
для садистів:document.evaluate(".//select[@id='sel']/option[text()='Fish']", document.body, null, 9, null).singleNodeValue.selected = true;
kzh

1
@llihttocs Що тепер?
кж

1
Дякуємо, що включили ванільний javascript - тим, хто любить
Пітер Каллен

24

Жоден із прикладів використання jquery тут насправді не є правильним, оскільки вони залишать вибір, який відображає першу запис, навіть якщо значення було змінено.

Правильний спосіб вибору Аляски і вибір повинен показати потрібний елемент, як вибрано, використовуючи:

<select id="state">
    <option value="AL">Alabama</option>
    <option value="AK">Alaska</option>
    <option value="AZ">Arizona</option>
</select>

З jquery буде:

$('#state').val('AK').change();

19

Ви можете змінити значення елемента select, який змінює вибраний варіант на той, який має це значення, використовуючи JavaScript:

document.getElementById('sel').value = 'bike';​​​​​​​​​​

DEMO


1
Ваш приклад не дуже працює через час. Я оновив його, щоб зачекати, поки користувач натисне кнопку: jsfiddle.net/xkqTR/3271
dlaliberte

це не призводить до зміни події на елементі вибору. у вас є рішення щодо цього?
DragonKnight

10

Розмітка

<select id="my_select">
    <option value="1">First</option>
    <option value="2">Second</option>
    <option value="3">Third</option>
</select>

jQuery

var my_value = 2;
$('#my_select option').each(function(){
    var $this = $(this); // cache this jQuery object to avoid overhead

    if ($this.val() == my_value) { // if this option's value is equal to our value
        $this.prop('selected', true); // select this option
        return false; // break the loop, no need to look further
    }
});

Демо


Я думаю, що це саме те, що мені було потрібно. Я вже використав кілька рядків вашого коду і, здається, працює. Дякуємо за чудові фрагменти.
llihttocs

@llihttocs: Радий, що допоміг. Не соромтеся приймати відповідь, яка вирішує вашу проблему, натиснувши порожній галочку під підрахунком голосів у верхній лівій частині відповіді. Так що це питання буде позначене як вирішене, а інші, хто шукатиме те саме рішення, знайдуть відповідь легко.
Шеф

4

Я хочу змінити вибраний параметр вибору елемента як значення, так і textContent (що ми бачимо) на "Mango".

Найпростіший код, який працював, наведено нижче:

var newValue1 = 'Mango'

var selectElement = document.getElementById('myselectid');
selectElement.options[selectElement.selectedIndex].value = newValue1;
selectElement.options[selectElement.selectedIndex].textContent = newValue1;

Сподіваюся, що хтось допомагає. Удачі.
Голосуйте за голос, якщо це допомогло вам.


2

Перевірте цю демонстрацію

  1. Вибір параметра на основі його значення

    var vals = [2,'c'];
    
    $('option').each(function(){
       var $t = $(this);
    
       for (var n=vals.length; n--; )
          if ($t.val() == vals[n]){
             $t.prop('selected', true);
             return;
          }
    });
  2. Вибір параметра на основі його тексту

    var vals = ['Two','CCC'];                   // what we're looking for is different
    
    $('option').each(function(){
       var $t = $(this);
    
       for (var n=vals.length; n--; )
          if ($t.text() == vals[n]){            // method used is different
             $t.prop('selected', true);
             return;
          }
    });

Підтримуючий HTML

<select>
   <option value=""></option>
   <option value="1">One</option>
   <option value="2">Two</option>
   <option value="3">Three</option>
</select>

<select>
   <option value=""></option>
   <option value="a">AAA</option>
   <option value="b">BBB</option>
   <option value="c">CCC</option>
</select>

1
Цей приклад дуже корисний. Я не знав, як перебрати параметри та встановити вибраний атрибут. Дякую за таку повну відповідь.
llihttocs

Без проблем llihttocs, не забудьте натиснути стрілку вгору поруч із питаннями / коментарями, які вам здаються корисними. І поставте галочку біля обраної вами відповіді. - Ви можете зробити або без того, що коштуватиме вам що завгодно
vol7ron

1

Відмінні відповіді - ось версія D3 для всіх, хто шукає:

<select id="sel">
    <option>Cat</option>
    <option>Dog</option>
    <option>Fish</option>
</select>
<script>
    d3.select('#sel').property('value', 'Fish');
</script>

1

Я використав майже всі відповіді, розміщені тут, але мені це не зручно, тому я копаю один крок і знайшов просте рішення, яке відповідає моїм потребам і відчуваю, що варто поділитися з вами, хлопці.
Замість ітерації в усіх параметрах або використання JQuery ви можете виконати використання основних JS простими кроками:

Приклад

<select id="org_list">
  <option value="23">IBM</option>
  <option value="33">DELL</option>
  <option value="25">SONY</option>
  <option value="29">HP</option>
</select>

Отже, ви повинні знати значення опції для вибору.

function selectOrganization(id){
    org_list=document.getElementById('org_list');
    org_list.selectedIndex=org_list.querySelector('option[value="'+id+'"]').index;
}

Як використовувати?

selectOrganization(25); //this will select SONY from option List

Ваші коментарі вітаються. :) AzmatHunzai.


1

Після багатьох пошуків я спробував @kzh у списку вибору, де я знаю лише optionвнутрішній текст не valueатрибут, цей код на основі відповіді вибору я використовував його, щоб змінити параметр вибору відповідно до поточної сторінки urlцього формату http://www.example.com/index.php?u=Steve

<select id="sel">
    <option>Joe</option>
    <option>Steve</option>
    <option>Jack</option>
</select>
<script>
    var val = window.location.href.split('u=')[1]; // to filter ?u= query 
    var sel = document.getElementById('sel');
    var opts = sel.options;
    for(var opt, j = 0; opt = opts[j]; j++) {
        // search are based on text inside option Attr
        if(opt.text == val) {
            sel.selectedIndex = j;
            break;
        }
    }
</script>

Завдяки цьому urlпараметри відображатимуться як обрані, щоб зробити його більш зручним для користувачів, і відвідувач знає, яку сторінку чи профіль він зараз переглядає.


0

Я використав це після оновлення реєстру та змінив стан запиту через ajax, потім я роблю запит із новим станом у тому самому сценарії і вкладаю його в елемент вибору тегу new state для оновлення подання.

var objSel = document.getElementById("selectObj");
objSel.selectedIndex = elementSelected;

Сподіваюся, це корисно.


-1

Трохи акуратніша версія Vanilla.JS. Припустимо, що ви вже виправили nodeListвідсутні .forEach():

NodeList.prototype.forEach = Array.prototype.forEach

Просто:

var requiredValue = 'i-50332a31',   
  selectBox = document.querySelector('select')

selectBox.childNodes.forEach(function(element, index){
  if ( element.value === requiredValue ) {
    selectBox.selectedIndex = index
  }
})
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.