あまり。WebKit は、ドキュメント内の有効な選択/キャレット位置に関する WebKit の考え方に準拠するように、範囲が選択範囲に追加されるときにその範囲の各境界を正規化します。元の関数を変更して、要素内のすべてのテキストを含む選択のケースを検出し、その要素を囲むように選択範囲を拡張することができます (実際に選択を変更する必要はありません)。簡単な例を次に示します (テキストがネストされた要素内にある場合、ブロック/インライン要素を検出する場合など、より一般的なケースでは、より賢いものが必要になる場合があります):
デモ: http://jsfiddle.net/btLeg/
コード:
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;
}