[FIX] web: openerpframework: replaceElement on multiple roots nodeset
jquery's `replaceWith` function behaves differently between 1.8 and 1.9.
This function is used by `renderElement` of the Odoo widget API and, when
called on a template with multiple root nodes, will fail to replace the
whole original nodeset by the new but instead will replace every node
by the new nodeset.
Sample:
1) Suppose a DOM containing
<div>1</div>
<div>2</div>
and a jquery nodeset [<div>1</div>, <div>2</div>] referring to the
previous DOM part in a var named $oldel.;
2) suppose another jquery nodeset [<div>3</div>, <div>4</div>] in $el;
$oldel.replaceWith($el) will result in
"3434" in jquery 1.9.1
"34" in jquery 1.8.3
This issue particulary concerns us when the dom of a widget is not wrapped
into single tag and when re-calling renderElement (triggering replaceElement).
The fix is to wrap the element to be replaced ($oldel in the example) behind
a div before calling replaceWith.
This commit is contained in:
@@ -688,7 +688,12 @@ openerp.Widget = openerp.Class.extend(openerp.PropertiesMixin, {
|
||||
var $oldel = this.$el;
|
||||
this.setElement($el);
|
||||
if ($oldel && !$oldel.is(this.$el)) {
|
||||
$oldel.replaceWith(this.$el);
|
||||
if ($oldel.length > 1) {
|
||||
$oldel.wrapAll('<div/>');
|
||||
$oldel.parent().replaceWith(this.$el);
|
||||
} else {
|
||||
$oldel.replaceWith(this.$el);
|
||||
}
|
||||
}
|
||||
return this;
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user