Chrome no obtiene las tags de envoltura de cadena html seleccionadas (contenteditable)

Estoy usando esta solución de Tim Down para obtener html seleccionado en un div satisfactorio, y está funcionando bien (¡gracias Tim!) Pero usando Chrome, si selecciono una cadena html exactamente en los límites de una etiqueta html, como en este imagen: http://sofes.miximages.com/javascript/UiYzrcp.png?1 :

lo que obtengo es texto simple ( test en este caso).

Si amplío la selección a un siguiente carácter (letra c por ejemplo), en su lugar obtengo el html correcto ( test c ).

¿Puedo obtener el html completo en Webkit seleccionando una palabra como en la imagen? Gracias

Realmente no. WebKit normaliza cada límite de cualquier rango cuando se agrega a la selección para que se ajuste a la idea de WebKit de las posiciones de selección / intercalación válidas en el documento. Puede cambiar la función original para que detecte el caso de una selección que contenga todo el texto dentro de un elemento y ampliar el rango de selección para rodear ese elemento (sin cambiar realmente la selección). Aquí hay un ejemplo simple (puede necesitar algo más inteligente para un caso más general, como cuando el texto está dentro de elementos nesteds, detección de elementos en bloque / en línea, etc.):

Demostración: http://jsfiddle.net/btLeg/

Código:

 function adjustRange(range) { range = range.cloneRange(); // Expand range to encompass complete element if element's text // is completely selected by the range var container = range.commonAncestorContainer; var parentElement = container.nodeType == 3 ? container.parentNode : container; if (parentElement.textContent == range.toString()) { range.selectNode(parentElement); } return range; } function getSelectionHtml() { var html = "", sel, range; if (typeof window.getSelection != "undefined") { sel = window.getSelection(); if (sel.rangeCount) { var container = document.createElement("div"); for (var i = 0, len = sel.rangeCount; i < len; ++i) { range = adjustRange( sel.getRangeAt(i) ); container.appendChild(range.cloneContents()); } html = container.innerHTML; } } else if (typeof document.selection != "undefined") { if (document.selection.type == "Text") { html = document.selection.createRange().htmlText; } } return html; }