选定文本的HTML

27

有没有一种跨浏览器的方法可以获取所选文本的HTML?


已经在 SO 上回答了:https://dev59.com/k3VD5IYBdhLWcg3wWKLc - wiifm
可能是重复的问题:获取浏览器中选定文本的跨平台方法。 - Sarfraz
7
那个问题的答案都不太好,并且它是一个不同的问题:它要求选定文本,而不是选定文本的HTML。 - Tim Down
2
最近有一个重复的问题被发布了(并且有更多的答案):https://dev59.com/uW035IYBdhLWcg3wErvM - Anderson Green
@Booligoosh:这是一个不同的问题,询问选择的纯文本而不是HTML。 - Tim Down
显示剩余2条评论
2个回答

49

这个函数可以在所有主流浏览器中使用:

function getSelectionHtml() {
    var html = "";
    if (typeof window.getSelection != "undefined") {
        var sel = window.getSelection();
        if (sel.rangeCount) {
            var container = document.createElement("div");
            for (var i = 0, len = sel.rangeCount; i < len; ++i) {
                container.appendChild(sel.getRangeAt(i).cloneContents());
            }
            html = container.innerHTML;
        }
    } else if (typeof document.selection != "undefined") {
        if (document.selection.type == "Text") {
            html = document.selection.createRange().htmlText;
        }
    }
    return html;
}


// bind events for selection

document.addEventListener('mouseup', function(){
  var selectedHTML = getSelectionHtml();
  if( selectedHTML )
    console.log( selectedHTML )
});

document.addEventListener('keyup', function(e){ 
  var selectedHTML, key = e.keyCode || e.which; 
  if( key == 16 ){ // if "shift" key was released
    selectedHTML = getSelectionHtml();
    if( selectedHTML )
      console.log( selectedHTML )
  }
});
<ul contenteditable>
  <li><p>Select <b>this</b> <em>text</em> right <i>here</i></p></li>
  <li>Or <b>this text</b></li>
</ul>


3
这种解决方案的问题在于,当你选择<p>第一段文字TEXT TO</p><p>BE SELECTED第二段文字</p>中的大写锁定部分时,你得到的不是期望的"TEXT TO</p><p>BE SELECTED",而是"<p>TEXT TO</p><p>BE SELECTED</p>"-由于某种原因,浏览器添加了不在选择范围内的标记,以便关闭那些被选中的标记。有没有办法只获取实际上在选择范围内的内容? - HonzaBé
3
一个 HTML 文档基本上是节点树。一旦初始的 HTML 文本被解析,它就消失了,你需要处理节点。将选择内容转换成你所提议的字符串是可能的(但相对较为复杂),但不能保证与原始的 HTML 文本匹配,因为 HTML 只是表示文档的许多同样有效的方式之一。 - Tim Down
我实际上想要的行为是@honzzz不想要的,但我得到了他想要的。<p>第一个段落TEXT TO</p><p>BE SELECTED第二个段落</p>应该返回<p>TEXT TO</p><p>BE SELECTED</p>而不是TEXT TO</p><p>BE SELECTED。 - Stotra

0
如果您只需要选择的文本,请使用 .toString()
window.getSelection()?.toString()
'Is there a cross-browser way to get HTML of selected text?'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接