Remove empty TextNode left behind by IE8 setInnerHTML workaround
Andreas Svensson committed
Jul 21, 2014 at 22:12 UTC
8a135c0e75cfc3dfaba26deb49c8d85f12fa294b
2 files changed
+17
-1
src/browser/ui/__tests__/ReactMount-test.js
+8
@@ -106,4 +106,12 @@ describe('ReactMount', function() {
106
expect(mockMount.mock.calls.length).toBe(2);
107
expect(mockUnmount.mock.calls.length).toBe(1);
108
});
109
+
110
+ it('should reuse markup if rendering to the same target twice', function() {
111
+ var container = document.createElement('container');
112
+ var instance1 = React.renderComponent(<div />, container);
113
+ var instance2 = React.renderComponent(<div />, container);
114
+
115
+ expect(instance1 === instance2).toBe(true);
116
+ });
117
});
src/browser/ui/dom/setInnerHTML.js
+9
-1
@@ -66,7 +66,15 @@ if (ExecutionEnvironment.canUseDOM) {
66
// Recover leading whitespace by temporarily prepending any character.
67
// \uFEFF has the potential advantage of being zero-width/invisible.
68
node.innerHTML = '\uFEFF' + html;
69
- node.firstChild.deleteData(0, 1);
69
+
70
+ // deleteData leaves an empty `TextNode` which offsets the index of all
71
+ // children. Definitely want to avoid this.
72
+ var textNode = node.firstChild;
73
+ if (textNode.data.length === 1) {
74
+ node.removeChild(textNode);
75
+ } else {
76
+ textNode.deleteData(0, 1);
77
+ }
78
} else {
79
node.innerHTML = html;
80
}