获取突出显示/选定的文本

问题描述 投票:0回答:7

是否可以获取网站段落中突出显示的文本,例如通过使用 jQuery?

javascript jquery textselection
7个回答
598
投票

获取用户选择的文本相对简单。使用 jQuery 没有任何好处,因为除了

window
document
对象之外,您不需要任何东西。

function getSelectionText() {
    var text = "";
    if (window.getSelection) {
        text = window.getSelection().toString();
    } else if (document.selection && document.selection.type != "Control") {
        text = document.selection.createRange().text;
    }
    return text;
}

如果您对处理

<textarea>
和文本
<input>
元素中的选择的实现感兴趣,您可以使用以下内容。由于现在是 2016 年,我省略了 IE 所需的代码 <= 8 support but I've posted stuff for that in many places on SO.

function getSelectionText() {
    var text = "";
    var activeEl = document.activeElement;
    var activeElTagName = activeEl ? activeEl.tagName.toLowerCase() : null;
    if (
      (activeElTagName == "textarea") || (activeElTagName == "input" &&
      /^(?:text|search|password|tel|url)$/i.test(activeEl.type)) &&
      (typeof activeEl.selectionStart == "number")
    ) {
        text = activeEl.value.slice(activeEl.selectionStart, activeEl.selectionEnd);
    } else if (window.getSelection) {
        text = window.getSelection().toString();
    }
    return text;
}

document.onmouseup = document.onkeyup = document.onselectionchange = function() {
  document.getElementById("sel").value = getSelectionText();
};
Selection:
<br>
<textarea id="sel" rows="3" cols="50"></textarea>
<p>Please select some text.</p>
<input value="Some text in a text input">
<br>
<input type="search" value="Some text in a search input">
<br>
<input type="tel" value="4872349749823">
<br>
<textarea>Some text in a textarea</textarea>


143
投票

以这种方式获取突出显示的文本:

window.getSelection().toString()

当然还有对 ie 的特殊处理:

document.selection.createRange().htmlText

20
投票

使用

window.getSelection().toString()

您可以在 developer.mozilla.org

上阅读更多内容

14
投票

如果您使用 Chrome(无法验证其他浏览器)并且文本位于同一 DOM 元素中,则此解决方案有效:

window.getSelection().anchorNode.textContent.substring(
  window.getSelection().extentOffset, 
  window.getSelection().anchorOffset)

13
投票

是的,您可以使用简单的 JavaScript 片段来做到这一点:

document.addEventListener('mouseup', event => {  
    if(window.getSelection().toString().length){
       let exactText = window.getSelection().toString();        
    }
}

10
投票

如果需要,您可以使用事件

    document.addEventListener('selectionchange', (e)=>{
        console.log("Archor node - ",window.getSelection().anchorNode);
        console.log("Focus Node - ",window.getSelection().toString());
    });

0
投票

寻找另一种方法来做到这一点。

window.getSelection()
的设计非常糟糕,令人沮丧。从第一天开始,它应该是基于文本的函数,而不是基于节点的函数。

让我们来看一些非常基本的事情 - 您想要突出显示文本并将该部分设置为粗体。太棒了,window.getSelection() 非常适合...一次。

但是,既然您还想将文本的一部分设为斜体……那么……现在您就完蛋了。您想要突出显示的文本现在分为 2 个或可能更多的节点,因此您无法完整查找所选短语,您可能有几段相同的文本,因此循环遍历节点不会帮助您到达应该对文本进行编辑的位置,window.getSelection() 给出的起点仅适用于文本而不适用于格式...它只会变得一团糟。

不要使用它,它是来自一个时代的垃圾,在这个时代,糟糕的程序员认为规定你使用什么浏览器或如何突出显示文本是他们的责任 - 如果有什么问题或错误,那是用户没有按照这种方式做事的错程序员希望他们这样做。

从头开始自己编写更好的代码。

甚至可能将所有字母放入一个数组中,其中数组中的每个项目都是一个字母,然后如果必须的话用 onmousedown/onmouseup 决定起点和终点。

但不幸的是,这根本不适合你想要它做的 99% 的事情。

© www.soinside.com 2019 - 2024. All rights reserved.