@samitouri / QOS-React-2 / commits / 8a135c0e75

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 }