diff --git a/package.json b/package.json index 91c2daef..cc6e06c4 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "rangy", "description": "A cross-browser DOM range and selection library", - "version": "1.3.1-dev", + "version": "1.3.2-dev", "author": { "name": "Tim Down", "email": "tim@timdown.co.uk", diff --git a/src/core/domrange.js b/src/core/domrange.js index 9bc49674..a032f9a9 100644 --- a/src/core/domrange.js +++ b/src/core/domrange.js @@ -5,7 +5,7 @@ var util = api.util; var DomPosition = dom.DomPosition; var DOMException = api.DOMException; - + var voidElements = ["area", "base", "br", "col", "command", "embed", "hr", "img", "input", "keygen", "link", "meta", "param", "source", "track", "wbr"]; var isCharacterDataNode = dom.isCharacterDataNode; var getNodeIndex = dom.getNodeIndex; var isOrIsAncestorOf = dom.isOrIsAncestorOf; @@ -54,7 +54,11 @@ n.parentNode.insertBefore(node, o == 0 ? n : splitDataNode(n, o)); } } else if (o >= n.childNodes.length) { - n.appendChild(node); + if (canAppendChild(n)) { + n.appendChild(node); + } else { + n.parentNode.insertBefore(node, n); + } } else { n.insertBefore(node, n.childNodes[o]); } @@ -75,6 +79,12 @@ return touchingIsIntersecting ? startComparison <= 0 && endComparison >= 0 : startComparison < 0 && endComparison > 0; } + function canAppendChild(element) { + var nodeName = element.tagName.toLowerCase(); + + return voidElements.indexOf(nodeName) === -1; + } + function cloneSubtree(iterator) { var partiallySelected; for (var node, frag = getRangeDocument(iterator.range).createDocumentFragment(), subIterator; node = iterator.next(); ) {