Javascript:如何检测单词是否突出显示

IT技术 javascript events highlight detect
2021-01-25 07:48:06

我正在编写一个 Firefox 插件,每当突出显示一个词时就会触发它。但是,我需要一个脚本来检测单词何时突出显示,但我被卡住了。一个例子是 nytimes.com(当你阅读一篇文章并突出显示一个词时,参考图标会弹出)。然而 nytimes.com 脚本非常复杂。我 16 岁,不是一个程序员,所以这绝对是我的联盟。

4个回答

要做到这一点最简单的方法是检测mouseupkeyup对文档的事件,并检查所有文本是否被选中。以下将适用于所有主要浏览器。

示例:http : //www.jsfiddle.net/timdown/SW54T/

function getSelectedText() {
    var text = "";
    if (typeof window.getSelection != "undefined") {
        text = window.getSelection().toString();
    } else if (typeof document.selection != "undefined" && document.selection.type == "Text") {
        text = document.selection.createRange().text;
    }
    return text;
}

function doSomethingWithSelectedText() {
    var selectedText = getSelectedText();
    if (selectedText) {
        alert("Got selected text " + selectedText);
    }
}

document.onmouseup = doSomethingWithSelectedText;
document.onkeyup = doSomethingWithSelectedText;
@Jespertheend 如果数据foo是动态生成的,那么您可以为每个数据提供一些唯一的 id foo,然后您可以使用它window.getSelection().getRangeAt(0).startContainer.parentNode.id来获取特定foo的 id。
2021-03-16 07:48:06
这太棒了,谢谢!我想在keypress输入事件上实现自定义 maxlength 功能,但是如果输入已经达到最大值,那么如果突出显示任何文本,按键仍然应该通过。你的功能完美地完成了工作
2021-03-25 07:48:06
但是如果您想检测是否选择了特定单词怎么办?假设您foo在页面上多次出现并且用户选择foo了您如何知道用户选择了哪些词?
2021-04-02 07:48:06

这是一个脚本:

<script>
function getSelText()
{
    var txt = '';
    if (window.getSelection)
    {
        txt = window.getSelection();
    }
    else if (document.getSelection)
    {
        txt = document.getSelection();
    }
    else if (document.selection)
    {
        txt = document.selection.createRange().text;
    }
    else return;
document.aform.selectedtext.value = txt;
}
</script>
<input type="button" value="Get selection" onmousedown="getSelText()"> 
<form name="aform">
<textarea name="selectedtext" rows="5" cols="20"></textarea>
</form>

代码蟾蜍提供:

http://www.codetoad.com/javascript_get_selected_text.asp

在您的情况下,您希望在进行选择时调用此脚本,然后您可以根据需要处理它,例如使用 AJAX 请求获取相关信息,就像 NYtimes 可能做的那样。

@TedCohen:确实,Selection对象确实具有合理的toString()实现,但您的其余评论没有意义:Selection如果window.getSelection存在,则始终返回对象(在所有现代浏览器中都是如此)。
2021-03-22 07:48:06
我一直在 SO 上看到这段代码,这是错误的:window.getSelection()返回一个Selection对象,而不是一个字符串。
2021-04-04 07:48:06
@tim down 这就是为什么你总是在 SO 上看到它。请阅读我最初评论中的参考资料,因为它非常清楚地说明了我在说什么,可能比我以往任何时候都好。
2021-04-04 07:48:06
@tim down 不是全部真相。该对象有一个 toString() 方法。当需要一个字符串时,将返回一个字符串,否则,正如您指出的那样,将返回一个对象。developer.mozilla.org/en-US/docs/Web/API/Window/getSelection
2021-04-11 07:48:06
是的,该方法返回一个对象。如果它没有返回一个对象,那么返回的“东西”怎么会有一个我们都同意的 toString() 方法。我不同意的是你关于代码错误的说法。你忘记的是 js 语言一直在隐式转换。有些人称之为弱类型语言。所有 js 程序员都需要发现转换并识别它是什么。浏览器返回对象后,js 隐式调用 toString() 方法并返回一个字符串。js 中的任何对象都会发生这种情况,而不仅仅是 getSelection()。代码没有错
2021-04-12 07:48:06

在我的情况下,我希望能够突出显示一行中的文本并单击该行并将我发送到其他路由,例如“/entity/:id”;

我创建了一个检测鼠标的函数正在突出显示一些文本:

export const isHighlighting = () => {
  // detects mouse is highlighting a text
  return window.getSelection && window.getSelection().type === 'Range';
};

然后我将其添加到

const handleClick = (id) => {
  if (!isHighlighting() {
     history.push(`/entity/${id}`)
  }
}

{data.map((item) => (
  <tr>
    <td onClick={() => handleClick(item.id)}>{item.name}</>
  </tr>
))}

通过这种方式,用户可以突出显示然后命名字段或单击其他位置并转到“/entity/:id”

使用rangy.js和 jQuery:

$('#elem').on('keyup mouseup', function(){
    var sel = rangy.getSelection()
    if (sel.rangeCount === 0 || sel.isCollapsed) return
    alert(sel.toString())
})