diff --git a/src/core/ReactDOMSelection.js b/src/core/ReactDOMSelection.js index bbee07f9b2..d5fa118103 100644 --- a/src/core/ReactDOMSelection.js +++ b/src/core/ReactDOMSelection.js @@ -137,7 +137,15 @@ function setModernOffsets(node, offsets) { var length = node[getTextContentAccessor()].length; var start = Math.min(offsets.start, length); var end = typeof offsets.end === 'undefined' ? - start : Math.min(offsets.end, length); + start : Math.min(offsets.end, length); + + // IE 11 uses modern selection, but doesn't support the extend method. + // Flip backward selections, so we can set with a single range. + if (!selection.extend && start > end) { + var temp = end; + end = start; + start = temp; + } var startMarker = getNodeForCharacterOffset(node, start); var endMarker = getNodeForCharacterOffset(node, end); @@ -146,8 +154,15 @@ function setModernOffsets(node, offsets) { var range = document.createRange(); range.setStart(startMarker.node, startMarker.offset); selection.removeAllRanges(); - selection.addRange(range); - selection.extend(endMarker.node, endMarker.offset); + + if (start > end) { + selection.addRange(range); + selection.extend(endMarker.node, endMarker.offset); + } else { + range.setEnd(endMarker.node, endMarker.offset); + selection.addRange(range); + } + range.detach(); } }