Làm thế nào để bạn loại bỏ tất cả các tùy chọn của một hộp chọn và sau đó thêm một tùy chọn và chọn nó với jQuery?


1077

Sử dụng jQuery lõi, làm thế nào để bạn loại bỏ tất cả các tùy chọn của hộp chọn, sau đó thêm một tùy chọn và chọn nó?

Hộp chọn của tôi là như sau.

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

EDIT: Đoạn mã sau rất hữu ích với chuỗi. Tuy nhiên, (trong Internet Explorer) .val('whatever')đã không chọn tùy chọn được thêm vào. (Tôi đã sử dụng cùng một 'giá trị' trong cả hai .append.val.)

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

EDIT: Cố gắng lấy mã này để bắt chước mã này, tôi sử dụng mã sau bất cứ khi nào trang / biểu mẫu được đặt lại. Hộp chọn này được điền bởi một tập hợp các nút radio. .focus()đã gần hơn, nhưng tùy chọn không xuất hiện được chọn như nó làm với .selected= "true". Không có gì sai với mã hiện tại của tôi - Tôi chỉ đang cố gắng học jQuery.

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

EDIT: câu trả lời được chọn gần với những gì tôi cần. Điều này làm việc cho tôi:

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

Nhưng cả hai câu trả lời đều đưa tôi đến giải pháp cuối cùng ..

Câu trả lời:


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

3
@nickf: Tôi có cùng một vấn đề, nhưng tôi cần thêm một bộ hộp kiểm thay vì một hộp thay đổi thả xuống nhưng hộp kiểm của tôi đến từ xml. việc này không hiệu quả
defau1t

10
Lưu ý bạn cũng có thể chia nhỏ tùy chọn / attr / văn bản như:.append($("<option></option>").attr("value", '123').text('ABC!')
Brock Hensley

1
@BrockHensley, tôi tin rằng sự tao nhã thực sự của câu trả lời này là sự kết hợp đúng đắn trong kết hợp với hàm end (). Đề nghị của bạn sẽ làm việc như là tốt. Từ Tài liệu API của jQuery: "Hầu hết các phương thức truyền tải DOM của jQuery hoạt động trên một cá thể đối tượng jQuery và tạo ra một đối tượng mới, khớp với một tập hợp các phần tử DOM khác. Khi điều này xảy ra, như thể tập hợp các phần tử mới được đẩy lên một ngăn xếp Mỗi phương thức lọc liên tiếp sẽ đẩy một phần tử mới được đặt lên ngăn xếp. Nếu chúng ta cần một bộ phần tử cũ hơn, chúng ta có thể sử dụng end () để bật lại các bộ của ngăn xếp. "
Anthony Mason

1
đây là cách duy nhất tôi có thể xây dựng lại menu của mình và thay đổi tùy chọn đã chọn trong jQuery Mobile trên PhoneGap cho iOS. Làm mới menu sau đó cũng được yêu cầu.
xited

3
@BrockHensley bạn thậm chí có thể đi xa đến mức.append($("<option></option>", {'value':'123'}).text('ABC!')
vahanpwns

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

34
Vì tò mò, 'trống rỗng' nhanh hơn 'tìm'? Có vẻ như nó sẽ như vậy - bởi vì 'find' sẽ sử dụng bộ chọn và 'trống rỗng' sẽ chỉ vũ phu làm trống phần tử.
Dan Esparza

52
@DanEsparza Tôi đã làm cho bạn một jsperf; empty()tất nhiên hóa ra nhanh hơn;) jsperf.com/find-remove-vs-empty
vzwick

Tôi đã có một trục trặc wierd với giải pháp này. Phần dân số của nó vẫn ổn, nhưng khi tôi cố gắng chọn một giá trị (trong trường hợp của tôi một ngày), tôi có thể điều khiển ghi lại giá trị, nhưng giá trị được hiển thị trong trường chọn vẫn ở giá trị đầu tiên .... Tôi có thể sẽ giải quyết nó: /
Takács Zsolt

5
@ TakácsZsolt Có lẽ bạn nên thêm một câu .val('whatever')ở cuối chuỗi như trong câu trả lời của Matt.
Kodos Johnson

.empty () hoạt động với vật chất hóa, trong khi .remove () không hoạt động
OverlordvI

127

Tại sao không sử dụng javascript đơn giản?

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

7
Tôi đồng ý rằng đây là giải pháp đơn giản nhất để xóa tất cả các tùy chọn, nhưng chỉ trả lời được một nửa câu hỏi ...
Elezar

2
Điều này sẽ không tạo ra một rò rỉ bộ nhớ? Các yếu tố tùy chọn hiện không thể truy cập nhưng vẫn được phân bổ.
Synetech

1
Đồng bằng cũ FT FTW (Dành cho Người thắng cuộc) !!! :)
raddevus

78

Nếu mục tiêu của bạn là xóa tất cả các tùy chọn khỏi lựa chọn ngoại trừ tùy chọn đầu tiên (thường là tùy chọn 'Vui lòng chọn một mục'), bạn có thể sử dụng:

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

10
Đây nên là câu trả lời. Tất cả những người khác cố tình loại bỏ cái đầu tiên với quan điểm tái tạo nó sau đó, điều mà tôi không thích; nó cũng ngụ ý rằng họ đã lưu trữ tùy chọn đầu tiên ở đâu đó trước tiên.

76

Tôi đã gặp một lỗi trong IE7 (hoạt động tốt trong IE6) khi sử dụng các phương thức jQuery ở trên sẽ xóa phần chọn trong DOM nhưng không hiển thị trên màn hình. Sử dụng Thanh công cụ dành cho nhà phát triển IE Tôi có thể xác nhận rằng phần chọn đã bị xóa và có các mục mới, nhưng trực quan phần chọn vẫn hiển thị các mục cũ - mặc dù bạn không thể chọn chúng.

Cách khắc phục là sử dụng các phương thức / tiêu chuẩn DOM tiêu chuẩn (như bản gốc của poster) để xóa thay vì jQuery - vẫn sử dụng jQuery để thêm tùy chọn.

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

6
Tôi cũng đã phải sử dụng phương thức này trong eg6 vì .empty () khiến hộp chọn của tôi được chứa trong một thùng chứa ẩn có thể nhìn thấy được ngay cả khi cha mẹ bị ẩn.
Chỉ huy mã

2
Phương pháp này cũng hóa ra là một chút nhỏ bé (khoảng 1%) hiệu suất cao hơn: jsperf.com/find-remove-vs-empty
vzwick

3
+1 đây là câu dễ đọc nhất (theo ý kiến ​​của tôi) và trong liên kết jsPerf (@vzwick được liên kết), câu trả lời được chấp nhận chậm hơn 34% (Opera 20)
Morvael

35

Không chắc chắn chính xác những gì bạn có nghĩa là "thêm một và chọn nó", vì nó sẽ được chọn theo mặc định. Nhưng, nếu bạn thêm nhiều hơn một, nó sẽ có ý nghĩa hơn. Làm thế nào về một cái gì đó như:

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

Trả lời "EDIT" : Bạn có thể làm rõ ý của bạn bằng cách "Hộp chọn này được đặt bằng một bộ nút radio" không? Một <select>phần tử không thể (về mặt pháp lý) có chứa <input type="radio">các phần tử.


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

2
Chúng tôi vẫn đang sử dụng IE6 và phương pháp này không hoạt động. Tuy nhiên, nó đã hoạt động trong FF 3.5.6
Jay Corbett

3
có thể phải thêm .change () vào cuối để kích hoạt thay đổi lựa chọn
Hayden Chambers

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

12

Nhờ những câu trả lời tôi nhận được, tôi đã có thể tạo ra một cái gì đó như sau, phù hợp với nhu cầu của tôi. Câu hỏi của tôi có phần mơ hồ. Cảm ơn đã theo dõi. Vấn đề cuối cùng của tôi đã được giải quyết bằng cách đưa "chọn" vào tùy chọn mà tôi muốn chọn.

$(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>


8

Làm thế nào về việc chỉ thay đổi html sang dữ liệu mới.

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

Một vi dụ khac:

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

8
  1. Trước tiên, xóa tất cả tùy chọn hiện tại đã thực hiện cái đầu tiên (- Chọn--)

  2. Nối các giá trị tùy chọn mới bằng cách sử dụng vòng lặp từng cái một

    $('#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));
    }

7

Tôi đã tìm thấy trên mạng một cái gì đó như dưới đây. Với hàng ngàn tùy chọn như trong tình huống của tôi, điều này nhanh hơn rất nhiều so với .empty()hoặc .find().remove()từ 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;
}

Thêm thông tin ở đây .



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

Dòng mã đầu tiên sẽ loại bỏ tất cả các tùy chọn của hộp chọn vì không có tiêu chí tìm tùy chọn nào được đề cập.

Dòng mã thứ hai sẽ thêm Tùy chọn với giá trị được chỉ định ("testValue") và Văn bản ("TestText").


Mặc dù điều này có thể trả lời câu hỏi, nhưng nó sẽ hữu ích hơn rất nhiều nếu bạn đưa ra lời giải thích về cách nó trả lời nó.
Nick

6

Dựa trên câu trả lời của mauretto, điều này dễ đọc và dễ hiểu hơn một chút:

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

Để xóa tất cả các tùy chọn ngoại trừ một tùy chọn có giá trị cụ thể, bạn có thể sử dụng tùy chọn này:

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

Điều này sẽ tốt hơn nếu tùy chọn được thêm vào đã có sẵn.


4

Sử dụng jquery prop () để xóa tùy chọn đã chọn

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

1
.prop () chỉ có hiệu lực trong jQuery 1.6+. Đối với jQuery 1.5-, hãy sử dụng .attr ()
Agi Hammerthief

4

Điều này sẽ thay thế mySelect hiện tại của bạn bằng một mySelect mới.

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

4

Bạn có thể làm đơn giản bằng cách thay thế html

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

4

Chỉ cần một dòng để xóa tất cả các tùy chọn khỏi thẻ chọn và sau khi bạn có thể thêm bất kỳ tùy chọn nào, sau đó tạo dòng thứ hai để thêm tùy chọn.

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

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

2
  • lưu các giá trị tùy chọn sẽ được nối vào một đối tượng
  • xóa các tùy chọn hiện có trong thẻ chọn
  • Lặp lại đối tượng danh sách và nối các nội dung vào thẻ chọn dự định

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>


2

Tôi đã thấy mã này trong Chọn2 - Xóa lựa chọn

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

Mã này hoạt động tốt với jQuery ngay cả khi không có Select2


1

Hy vọng nó sẽ làm việc

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

nó hoạt động nếu nhiều hơn thì tùy chọn tôi không thể chọn cái thứ hai
Anburaj_N

0
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('');
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.