Как удалить все параметры поля выбора, а затем добавить один вариант и выбрать его с помощью jQuery?

Как с помощью основного jQuery удалить все параметры поля выбора, затем добавить один параметр и выбрать его?

Мое поле выбора следующее.

<Select id = "mySelect" size = "9"> </Select>

Обновлено: следующий код был полезен для цепочки. Однако (в Internet Explorer) .val('whatever') не выбрал добавленную опцию. (Я использовал одно и то же «значение» как в .append, так и в .val.)

$('#mySelect').find('option').remove().end()
.append('<option value = "whatever">text</option>').val('whatever');

Обновлено: пытаясь заставить его имитировать этот код, я использую следующий код всякий раз, когда страница / форма сбрасывается. Это поле выбора заполнено набором переключателей. .focus() был ближе, но вариант не был выбран, как с .selected= "true". С моим существующим кодом все в порядке - я просто пытаюсь изучить jQuery.

var mySelect = document.getElementById('mySelect');
mySelect.options.length = 0;
mySelect.options[0] = new Option ("Foo (only choice)", "Foo");
mySelect.options[0].selected = "true";

Обновлено: выбранный ответ был близок к тому, что мне нужно. Это сработало для меня:

$('#mySelect').children().remove().end()
.append('<option selected value = "whatever">text</option>') ;

Но оба ответа привели меня к моему окончательному решению ..

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1 132
0
1 166 668
24
Перейти к ответу Данный вопрос помечен как решенный

Ответы 24

Ответ принят как подходящий

$('#mySelect')
    .find('option')
    .remove()
    .end()
    .append('<option value = "whatever">text</option>')
    .val('whatever')
;

@nickf: у меня такая же проблема, но мне нужно добавить набор флажков, а не один при изменении раскрывающегося списка, но мои флажки поступают из xml. это не работает

defau1t 15.01.2012 15:32

Обратите внимание, что вы также можете разбить параметр / attr / text, например: .append($("<option></option>").attr("value", '123').text('ABC!')

Brock Hensley 28.06.2013 01:58

@BrockHensley, я считаю, что истинная элегантность этого ответа - правильная цепочка в сочетании с функцией end (). Ваше предложение тоже сработает. Из документации jQuery API: «Большинство методов обхода DOM jQuery работают с экземпляром объекта jQuery и создают новый, соответствующий другому набору элементов DOM. Когда это происходит, создается впечатление, что новый набор элементов помещается в стек. который поддерживается внутри объекта. Каждый последующий метод фильтрации помещает новый набор элементов в стек. Если нам нужен более старый набор элементов, мы можем использовать end (), чтобы вытолкнуть наборы обратно из стека ».

Anthony Mason 01.10.2015 22:03

Это был единственный способ восстановить меню и изменить выбранный параметр в jQuery Mobile на PhoneGap для iOS. После этого также потребовалось обновить меню.

xited 29.12.2015 01:26

@BrockHensley, вы могли бы даже пойти дальше .append($("<option></option>", {'value':'123'}).text('ABC!')

vahanpwns 10.04.2016 00:17

даже простое добавление. category.append ($ ('<option />', {value: Id, text: Name, selected: categoryid == Id}))

sairfan 26.03.2018 23:26

Почему не $('#mySelect OPTION').remove().append('<option value = "whatever">text</option>').val('whatever')?

Volomike 19.09.2019 11:34

Не совсем уверен, что вы имеете в виду под «добавить и выбрать», так как он все равно будет выбран по умолчанию. Но если бы вы добавили больше одного, это имело бы больший смысл. Как насчет чего-то вроде:

$('select').children().remove();
$('select').append('<option id = "foo">foo</option>');
$('#foo').focus();

Ответ на "РЕДАКТИРОВАТЬ": Не могли бы вы пояснить, что вы имеете в виду, говоря «Это поле выбора заполнено набором переключателей»? Элемент <select> не может (юридически) содержать элементы <input type = "radio">.

Благодаря полученным ответам я смог создать что-то вроде следующего, что соответствует моим потребностям. Мой вопрос был несколько двусмысленным. Спасибо за продолжение. Моя последняя проблема была решена включением «selected» в вариант, который я хотел выбрать.

$(function() {
  $('#mySelect').children().remove().end().append('<option selected value = "One">One option</option>') ; // clear the select box, then add one option which is selected
  $("input[name='myRadio']").filter( "[value='1']" ).attr( "checked", "checked" ); // select radio button with value 1
  // Bind click event to each radio button.
  $("input[name='myRadio']").bind("click",
                                  function() {
    switch(this.value) {
      case "1":
        $('#mySelect').find('option').remove().end().append('<option selected value = "One">One option</option>') ;
        break ;
      case "2":
        $('#mySelect').find('option').remove() ;
        var items = ["Item1", "Item2", "Item3"] ; // Set locally for demo
        var options = '' ;
        for (var i = 0; i < items.length; i++) {
          if (i==0) {
            options += '<option selected value = "' + items[i] + '">' + items[i] + '</option>';
          }
          else {
            options += '<option value = "' + items[i] + '">' + items[i] + '</option>';
          }
        }
        $('#mySelect').html(options);   // Populate select box with array
        break ;
    } // Switch end
  } // Bind function end
                                 ); // bind end
}); // Event listener end
<script src = "https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<label>One<input  name = "myRadio" type = "radio" value = "1"  /></label>
<label>Two<input name = "myRadio"  type = "radio" value = "2" /></label>
<select id = "mySelect" size = "9"></select>

$('#mySelect')
    .empty()
    .append('<option value = "whatever">text</option>')
    .find('option:first')
    .attr("selected","selected")
;

Мы все еще используем IE6, и этот метод не сработал. Однако он работал в FF 3.5.6.

Jay Corbett 31.12.2009 19:49

возможно, придется добавить .change () в конец, чтобы вызвать изменение выбора

Hayden Chambers 01.04.2011 13:59

$('#mySelect')
    .empty()
    .append('<option selected = "selected" value = "whatever">text</option>')
;

Просто из любопытства, «пусто» быстрее, чем «найти»? Похоже, что это так - потому что «find» будет использовать селектор, а «empty» будет просто грубой силой очистить элемент.

Dan Esparza 15.10.2010 01:11

@DanEsparza Я сделал тебя jsperf; empty() получился конечно быстрее;) jsperf.com/find-remove-vs-empty

vzwick 08.04.2012 18:12

У меня странный сбой с этим решением. С заполненной частью все в порядке, но когда я пытаюсь выбрать значение (в моем случае - день), я могу консоль регистрировать значение, но отображаемое значение в поле выбора остается на первом значении .... Я могу не разрешить это: /

Takács Zsolt 07.10.2016 16:42

@ TakácsZsolt Может быть, вам стоит добавить .val('whatever') в конце цепочки, как в ответе Мэтта.

Kodos Johnson 30.12.2016 20:32

.empty () работает с материализацией, тогда как .remove () не работает

user1239087 31.12.2018 02:58

У меня была ошибка в IE7 (отлично работает в IE6), когда использование вышеуказанных методов jQuery очищало Выбрать в DOM, но не на экране. Используя панель инструментов разработчика IE, я мог подтвердить, что Выбрать был очищен и имел новые элементы, но визуально Выбрать все еще отображал старые элементы, даже если вы не могли их выбрать.

Исправление заключалось в использовании стандартных методов / свойств DOM (как в оригинале плаката) для очистки, а не jQuery - по-прежнему с использованием jQuery для добавления параметров.

$('#mySelect')[0].options.length = 0;

Мне также пришлось использовать этот метод в ie6, потому что .empty () заставлял мое поле выбора, содержащееся в скрытом контейнере, становиться видимым, даже когда родительский элемент был скрыт.

Code Commander 05.01.2011 00:41

Этот метод также оказывается немного (примерно на 1%) более производительным: jsperf.com/find-remove-vs-empty

vzwick 08.04.2012 18:20

+1 это наиболее читаемый (на мой взгляд) и в ссылке jsPerf (ссылка на @vzwick) принятый ответ был на 34% медленнее (Opera 20)

Morvael 14.03.2014 14:33

$("#control").html("<option selected=\"selected\">The Option...</option>");

Если ваша цель - удалить все параметры из выбора, кроме первого (обычно это параметр «Выберите элемент»), вы можете использовать:

$('#mySelect').find('option:not(:first)').remove();

Это должен быть ответ. Все остальные намеренно удалили первое, чтобы потом воссоздать его, что мне не нравится; это также означает, что они сначала где-то сохранили первую опцию.

user1017882 23.01.2015 17:21

Это заменит ваш существующий mySelect новым mySelect.

$('#mySelect').replaceWith('<Select id = "mySelect" size = "9">
   <option value = "whatever" selected = "selected" >text</option>
   </Select>');

почему бы просто не использовать простой javascript?

document.getElementById("selectID").options.length = 0;

Я согласен с тем, что это простейшее решение для удаления всех параметров, но это отвечает только на половину вопроса ...

Elezar 04.08.2016 06:17

Разве это не приведет к утечке памяти? Элементы option теперь недоступны, но по-прежнему выделены.

Synetech 06.03.2019 22:57

Использует jquery опора () для очистки выбранной опции

$('#mySelect option:selected').prop('selected', false);

.prop () вступает в силу только в jQuery 1.6+. Для jQuery 1.5- используйте .attr ()

Agi Hammerthief 06.03.2014 16:48

Как насчет того, чтобы просто изменить HTML на новые данные.

$('#mySelect').html('<option value = "whatever">text</option>');

Другой пример:

$('#mySelect').html('
    <option value = "1" selected>text1</option>
    <option value = "2">text2</option>
    <option value = "3" disabled>text3</option>
');

Я нашел в сети что-то вроде ниже. С тысячами вариантов, как в моей ситуации, это намного быстрее, чем .empty() или .find().remove() из jQuery.

var ClearOptionsFast = function(id) {
    var selectObj = document.getElementById(id);
    var selectParentNode = selectObj.parentNode;
    var newSelectObj = selectObj.cloneNode(false); // Make a shallow copy
    selectParentNode.replaceChild(newSelectObj, selectObj);
    return newSelectObj;
}

Подробнее здесь.

Основываясь на ответе Мавретто, это немного легче читать и понимать:

$('#mySelect').find('option').not(':first').remove();

Чтобы удалить все параметры, кроме одного с определенным значением, вы можете использовать это:

$('#mySelect').find('option').not('[value=123]').remove();

Было бы лучше, если бы опция для добавления уже была там.

  1. Сначала очистите все существующие параметры, кроме первого (- Выбрать--)

  2. Добавляйте новые значения параметров, используя цикл один за другим

    $('#ddlCustomer').find('option:not(:first)').remove();
    for (var i = 0; i < oResult.length; i++) {
       $("#ddlCustomer").append(new Option(oResult[i].CustomerName, oResult[i].CustomerID + '/' + oResult[i].ID));
    }
    

Можно просто заменить html

$('#mySelect')
.html('<option value = "whatever" selected>text</option>')
.trigger('change');

Надеюсь, это сработает

$('#myselect').find('option').remove()
.append($('<option></option>').val('value1').html('option1'));

он работает, если больше, чем вариант, я не могу выбрать второй

Anburaj_N 31.08.2018 13:52

По-другому:

$('#select').empty().append($('<option>').text('---------').attr('value',''));

По этой ссылке есть хорошие практики https://api.jquery.com/select/

var select = $('#mySelect');
select.find('option').remove().end()
.append($('<option/>').val('').text('Select'));
var data = [{"id":1,"title":"Option one"}, {"id":2,"title":"Option two"}];
for(var i in data) {
    var d = data[i];
    var option = $('<option/>').val(d.id).text(d.title);
    select.append(option);
}
select.val('');
  • сохранить значения параметров для добавления в объект
  • очистить существующие параметры в теге выбора
  • итерация объекта списка и добавление содержимого к предполагаемому тегу выбора

var listToAppend = {'':'Select Vehicle','mc': 'Motor Cyle', 'tr': 'Tricycle'};

$('#selectID').empty();

$.each(listToAppend, function(val, text) {
    $('#selectID').append( new Option(text,val) );
  });
<script src = "https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

$("#id option").remove();
$("#id").append('<option value = "testValue" >TestText</option>');

Первая строка кода удалит все параметры поля выбора, поскольку критерии поиска параметров не были упомянуты.

Вторая строка кода добавит Option с указанным значением («testValue») и текстом («TestText»).

Хотя это может ответить на вопрос, было бы намного полезнее, если бы вы объяснили, что как отвечает на него.

Nick 12.10.2018 13:36

Я видел этот код в Select2 - Очистка выбора

$('#mySelect').val(null).trigger('change');

Этот код хорошо работает с jQuery даже без Select2

Just one line to remove all options from the select tag and after you can add any options then make second line to add options.

$('.ddlsl').empty();

$('.ddlsl').append(new Option('Select all', 'all'));

One more short way but didn't tried

$('.ddlsl').empty().append(new Option('Select all', 'all'));

Пытаться

mySelect.innerHTML = `<option selected value = "whatever">text</option>`

function setOne() {
  console.info({mySelect});
  mySelect.innerHTML = `<option selected value = "whatever">text</option>`;
}
<button onclick = "setOne()" >set one</button>
<Select id = "mySelect" size = "9"> 
 <option value = "1">old1</option>
 <option value = "2">old2</option>
 <option value = "3">old3</option>
</Select>

Другие вопросы по теме