简体   繁体   中英

Setting the selected attribute on an option element for real using jQuery

I am generating a select list with option elements in jQuery. Simplified it looks like this:

var sel = $("<select>");
$.each(data, function(i, v){
    $("<option>").attr({ "value": i }).html(v).appendTo(sel);
});

Then I want an option to be selected. Normally I would do something like:

$(sel).val(1);

But then the option does not have the selected attribute present.

$(sel).html() gives something like:

<option value="1">1</option>
<option value="2">2</option>

and this is what I expected:

<option value="1" selected="selected">1</option>
<option value="2">2</option>

I tried this approach (same result as using .val()):

$.each(data, function(i, v){
    var attrs = { "value": i };
    if(i == 1){
        attrs.selected = "selected";
    }
    $("<option>").attr(attrs).html(v).appendTo(sel);
});

but the only way I found working is:

$.each(data, function(i, v){
    var el = "<option>";
    if(i == 1){
        el = '<option selected="selected"></option>';
    }
    $(el).attr({ "value": i }).html(v).appendTo(sel);
});

Is there any other or better way?

You could use the native setAttribute() method . I believe jQuery muddles the distinction between attributes and properties.

This gets the <option> you want by its index from the <select> element's options collection , and sets the attribute:

sel[0].options[1].setAttribute('selected','selected');

Or this uses jQuery to set the value first, then goes back and gets the correct option using the native selectedIndex property .

sel.val(1);
sel[0].options[sel[0].selectedIndex].setAttribute('selected','selected');

EDIT: Off topic a little, but you could create the <option> elements a little differently like this:

$("<option>",{
    value: i,
    html: v
}).appendTo(sel);

Since jQuery 1.4, you can send a collection of values you wish to set for a new element.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM