Side navigation
#1294 closed bug (wontfix)
Opened June 13, 2007 11:12PM UTC
Closed September 18, 2007 02:42PM UTC
Last modified March 15, 2012 01:03AM UTC
selectedIndex lost after clone() in Internet Explorer
| Reported by: | jesse | Owned by: | brandon |
|---|---|---|---|
| Priority: | major | Milestone: | 1.1.4 |
| Component: | core | Version: | 1.1.3 |
| Keywords: | Cc: | ||
| Blocked by: | Blocking: |
Description
It seems that after a jQuery clone(), the value of select boxes are lost in IE (but not Firefox). Try this out:
<div>
<select>
<option value="0">one</option>
<option value="1" selected='selected'>two</option>
</select>
</div>
$(function(){
$('div').clone(true).appendTo('body');
});
The first option will be selected in the cloned select.
Doing something like this fixes the problem (as long as there is only one select box), though I suspect there needs to be a better fix in jQuery explicitly:
$(function(){
var old = $('div');
var clone = old.clone(true);
var select_val = $('select', old).val();
$('select', clone).val(select_val);
clone.appendTo('body');
});
Attachments (0)
Change History (7)
Changed July 12, 2007 08:42PM UTC by comment:1
Changed July 20, 2007 09:19PM UTC by comment:2
| owner: | → brandon |
|---|
Changed July 21, 2007 02:46AM UTC by comment:3
| milestone: | 1.1.3 → 1.1.4 |
|---|---|
| version: | 1.1.2 → 1.1.3 |
Changed July 21, 2007 03:16AM UTC by comment:4
| resolution: | → fixed |
|---|---|
| status: | new → closed |
Fixed in Rev [2438].
Changed July 21, 2007 05:07AM UTC by comment:5
Actually this bug also exists in the other browsers when the selected attribute isn't set. It also applied to checkboxes which Rev [2439] fixes. Except #769 causes IE6 to loose the checkbox state.
Changed August 24, 2007 11:18AM UTC by comment:6
| resolution: | fixed |
|---|---|
| status: | closed → reopened |
The bug is fixed but at a very high performance cost.
I wrote this new version:
clone: function(deep) {
deep = deep != undefined ? deep : true;
var $this;
if (jQuery.browser.msie) {
$this = this.add(this.find("*"));
// Need to remove events on the element and its descendants
$this.each(function() {
this._$events = {};
for (var type in this.$events)
this._$events[type] = jQuery.extend({},this.$events[type]);
}).unbind();
}
// Do the clone
var copy = false, r = this.pushStack( jQuery.map( this, function(a){
if (!copy && deep && ( a.hasChildNodes() || jQuery.nodeName(a,"select") || jQuery.nodeName(a,"input") ) ) copy = true;
return a.cloneNode( deep );
}) );
if (jQuery.browser.msie) {
$this.each(function() {
// Add the events back to the original and its descendants
var events = this._$events;
for (var type in events)
for (var handler in events[type])
jQuery.event.add(this, type, events[type][handler], events[type][handler].data);
this._$events = null;
});
}
// copy form values over
if (copy) {
if (!jQuery.browser.msie)
$this = this.add(this.find("*"));
var origInputs = $this.filter('select,input[@type=checkbox]');
if (origInputs.length) {
var inputs = r.add(r.find('*')).filter('select,input[@type=checkbox]');
origInputs.each(function(i) {
if (this.selectedIndex)
inputs[i].selectedIndex = this.selectedIndex;
if (this.checked)
inputs[i].checked = true;
});
}
}
// Return the cloned set
return r;
},
It is still slower but much better when you clone a single element that is not a select or a checkbox.
If using clone(false) there's a very small performance hit, but i've read it is deprecated now
Changed September 18, 2007 02:42PM UTC by comment:7
| resolution: | → wontfix |
|---|---|
| status: | reopened → closed |
The fix for this is to expensive for the core and has been removed in 1.2. The workaround is simple. Just copy the selectedIndex from the original.
I have also seen this bug and would greatly appreciate a fix.