My approach is a little different.
Instead of modifying selects during cloning, I'm just watching every select
on page for change
event, and then, if value is changed I add needed selected
attribute to selected <option>
so it becomes <option selected="selected">
. As selection is now marked in <option>
's markup, it will be passed when you'll .clone()
it.
The only code you need:
//when ANY select on page changes its value
$(document).on("change", "select", function(){
var val = $(this).val(); //get new value
//find selected option
$("option", this).removeAttr("selected").filter(function(){
return $(this).attr("value") == val;
}).first().attr("selected", "selected"); //add selected attribute to selected option
});
And now, you can copy select any way you want and it'll have it's value copied too.
$("#my-select").clone(); //will have selected value copied
I think this solution is less custom so you don't need to worry if your code will break if you'll modify something later.
If you don't want it to be applied to every select on page, you can change selector on the first line like:
$(document).on("change", "select.select-to-watch", function(){