【问题标题】:Firefox - how to get selected text when using double clickFirefox - 使用双击时如何获取选定的文本
【发布时间】:2013-10-14 15:00:47
【问题描述】:

我创建了一个带有文本部分和链接的 contentEditable div。双击链接将选择链接文本。

<div contentEditable="true">
   This is a text and <a href="http://www.google.com">This_is_a_link</a>
</div>

之后调用 document.getSelection().getRangeAt(0).startContainer 会返回 div:

// => <div contenteditable="true">

而不是链接。我找不到找到 div 的哪一部分被选中的方法。

查看这个 jsfiddle(双击“This_is_a_link”,会有一个带有 startContainer 的控制台日志): http://jsfiddle.net/UExsS/1/

(来自小提琴的强制性 JS 代码)

$(function(){
    $('a').dblclick(function(e) {

        setTimeout(function() {
            console.log(window.getSelection().getRangeAt(0));
        }, 500);

    });
}); 

请注意,Chrome 的行为是正确的,在 Chrome 中运行上述 jsfiddle 将为 startContainer 提供 textElement。

有人遇到过这个问题吗?你找到解决方法了吗?

【问题讨论】:

  • 在 Firefox 中获取所选文本并非不可能。您从选择中获得的范围准确地告诉您它的边界在哪里。
  • 我得到了 startOffset = 0,endOffset = 0。你试过了吗?我正在使用 Firefox 24
  • 在 Firefox 24 的 jsFiddle 中,我得到 startOffset 1 和 endOffset 2,其中 startContainerendContainer 都指的是 &lt;div&gt;。这是我所期望的。
  • 我之前确实得到了 1 和 2。 1和2是什么意思?
  • 对于每个边界(开始和结束),如果容器是元素而不是文本节点,则偏移量是容器内边界之前的子节点数。在您的示例中,Firefox 中选择范围的开始位于&lt;div&gt; 的一个子节点之后(即紧跟在" This is a text and " 文本节点之后),而结束位于两个子节点之后(即紧随&lt;a&gt; 元素之后)。

标签: javascript jquery firefox selection contenteditable


【解决方案1】:

不要认为它是 Firefox 的错误,只是一种不同的实现。当您双击链接时,Firefox 不仅选择了文本,而且选择了整个 a-tag,因此选择的父节点正确设置为 div 容器。

我在你的小提琴中添加了这几行代码来证明这一点:

var linknode = window.getSelection().getRangeAt(0).commonAncestorContainer.childNodes[1];
console.log(linknode);        
console.log(window.getSelection().containsNode(linknode, false));

分叉小提琴:http://jsfiddle.net/XZ6vc/

当你运行它时,你会在 javascript 控制台中看到 linknode 包含你的链接,并且检查链接是否完全包含在选择中返回 true。

这也是问题的一种可能解决方案,尽管不是理想的解决方案。遍历 contenteditable 中的所有链接并检查其中一个是否完全包含在选择中。

虽然有一句忠告:如果不需要,不要重新发明轮子;-) 很可能有一些库/框架可以满足您的需求。

【讨论】:

  • 非常有趣。谢谢!除了成熟的所见即所得编辑器之外,我不知道其他库。
  • Firefox 中的 window.getSelection().getRangeAt(0).cloneContents() 和 window.getSelection.getRangeAt(0).toString() 会给你更多文本被明显选中。不管 range 对象是否设置了正确的边界,这肯定看起来很像 bug。在 Chrome 中,任何一个选项都可以让您准确地看到屏幕上可见的选择内容。
  • 此外,如果您手动选择特定范围,它的工作方式与 Chrome 相同,而不是使用双击选择。即,视觉效果,以及如果您使用 Ctrl-C 或其他方式复制粘贴所获得的效果,在 Firefox 中的双击和手动拖动选择以及 Chrome 中的任一选项之间是相同的,但是您从中得到的Range 对象是不同的,当在 Firefox 中从任何其他情况中双击选择时。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-01
  • 2016-07-11
  • 2012-11-22
  • 1970-01-01
  • 1970-01-01
  • 2010-11-28
相关资源
最近更新 更多