window.getSelection() 给了我选定的文本,但我想要 HTML

IT技术 javascript html dom selection
2021-03-17 01:29:10

我正在扩展 WYSIWYG HTML 编辑器(用于 Firefox),我想在选择周围添加标签。我在Mozilla Midas 规范中找不到实现此目的的函数

有一个命令可以用 HTML 替换选择。
所以如果我可以阅读选择内容,我可以将我的标签添加到这个字符串中。

window.getSelection()几乎可以工作,但它给了我nsISelection转换为纯文本字符串的方法。

PS:document.getSelection()返回纯文本字符串甚至不是nsISelection.

3个回答

查看DOM Range 规范您可以使用以下方法Range从 Firefox 中的用户选择中获取

var range = window.getSelection().getRangeAt(0);

注意一些浏览器,包括火狐,允许多选,可以通过getRangeAt()选择方法来访问

Range在这些节点中的DOM节点和偏移量来表示。一旦你得到了你的Range,就不是那么简单地做你想做的事,因为范围的边界可能在 DOM 树的不同级别的不同节点中,所以简单地用标签包围范围的内容并不总是可行的。您可以执行以下操作,但它会创建一个新的块元素来包含所选内容:

var range = window.getSelection().getRangeAt(0);
var selectionContents = range.extractContents();
var div = document.createElement("div");
div.style.color = "yellow";
div.appendChild(selectionContents);
range.insertNode(div);

另一个,hacky,替代方法是使用修改选择execCommand()方法document(例如通过将其设置为特定颜色),然后使用document.querySelectorAll或 某些选择器库来选择具有该颜色的元素,然后对它们应用样式。

最后一行有一个小错误,你需要 s/span/div/
2021-04-17 01:29:10
@Will:啊,是的。谢谢,现在修好了。
2021-04-20 01:29:10
@tim问题是,如果我会尝试提取的开始和结束的范围对象,这是不返回这是给我通过确切位置window.getSelection()对象..任何方式来获得,如果我同时使用,然后window.getSelection( ).getRangeAt(0)范围开始和结束覆盖window.getSelection()对象开始和结束值。任何方式更多请点击我在这里发布的链接stackoverflow.com/questions/42113694/...
2021-04-29 01:29:10
这让我很开心:) 谢谢@TimDown
2021-05-05 01:29:10

Tim Down 的回答是正确的。然而,一个问题是 extractContents() 将从 dom 中删除选择。您可以使用

window.getSelection().getRangeAt(0).cloneContents(); 

只需获取所选内容的副本。然后你可以用你的新标签包装它,然后用它替换选择。Tim Down 对跨越多个 HTML 元素的范围的担忧当然是有道理的。我认为一旦你获得了范围,它就会“修复”html,但是当你把它放回去时可能会导致问题。 是关于 Range 对象的一个​​很好的资源。

我发帖的时候还没说完。我现在已经完成了我的回答。使用extractContents是有意的,因为您需要在重新插入之前从文档中删除内容。
2021-04-25 01:29:10
是的,我认为使用 extractContents 来解决这个问题会有一个很好的方法,我只是想我应该指出它是“破坏性的”,还有另一种方法来获取所选的 html。无论如何,很好的答案,+1。
2021-05-12 01:29:10

window.getSelection() 将返回一个对象。您可以通过调用对象 .toString() 方法将返回的选择对象用作字符串。

var selObj = window.getSelection();
var selectedText = selObj.toString(); 

https://developer.mozilla.org/en/DOM/window.getSelection

旧答案,但返回一个空字符串,没有标记。我用alert().
2021-05-09 01:29:10