【问题标题】:Javascript surroundContents on selection doesn't work as expected if used on part of an already selected element如果在已选择元素的一部分上使用,则选择的 Javascript 环绕内容无法按预期工作
【发布时间】:2011-09-11 05:24:53
【问题描述】:

我想突出显示用户选择的文本并将其复制到文本框中。

后半部分效果很好。但是,如果我尝试突出显示已突出显示的文本的一部分,则突出显示所选文本会失败。

这是JSFiddle 尝试选择右侧框中的文本,然后尝试选择之前选择的部分内容。

有什么想法吗?

相关代码:

function highlightSelected() {
var selection = getSelected();
var range = selection.getRangeAt(0);
var newNode = document.createElement("span");
$(newNode).addClass('mark');
range.surroundContents(newNode);
return range;
}

谢谢!!

【问题讨论】:

    标签: javascript jquery string text selection


    【解决方案1】:

    surroundContents() 只能在将整个范围包含在单个元素中生成有效的 HTML 时才能工作(该定义相当松散:请参阅the spec 以获得正确的定义)。例如,可以使用surroundContents() 包围以下范围(用管道表示):

    <p>fo|o<i>bar</i>ba|z</p>
    

    ...而以下不能:

    <p>fo|o<i>ba|r</i>baz</p>
    

    您的选择取决于您想要实现的目标。如果你只是想改变选择的背景颜色,你可以use document.execCommand() for that。如果你必须在整个选择内容中添加一个类,你需要一些更复杂的东西,比如我的Rangy库的class applier module

    【讨论】:

    • 嘿蒂姆!我在搜索中遇到了您的 Rangy 库,但还不愿意使用它,因为它占用的空间很大,压缩了 15KB。所以我在想,对于我正在尝试做的事情 - 这是一个矫枉过正。
    • 另外,@TimDown:我尝试了您链接到的解决方案,但问题仍然存在:突出显示一个大片段,然后尝试突出显示其中的一部分不起作用。我究竟做错了什么 ?我更新了小提琴。
    • 问题解决了!!!我所要做的就是在鼠标按下时删除以前的高光,而不是向上。此外,我将文本元素的大小增加到包装元素的完整大小,以防止鼠标在文本之外时不会触发 mouseup。小提琴更新了!
    • 你的类应用程序来处理粗糙的岩石!
    猜你喜欢
    • 1970-01-01
    • 2016-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-22
    • 2023-01-13
    • 2017-09-18
    相关资源
    最近更新 更多