[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:
Simon Lejeune
2014-12-19 17:49:13 +01:00
parent b291f9f4c6
commit 01409c1d7b
+6 -1
View File
@@ -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;
},