【发布时间】:2011-06-10 09:13:09
【问题描述】:
我正在编写一个 Firefox 插件,只要突出显示一个单词就会触发它。但是,我需要一个脚本来检测何时突出显示单词,并且我被卡住了。一个例子是 nytimes.com(当您阅读一篇文章并突出显示一个单词时,参考图标会弹出)。但是 nytimes.com 脚本非常复杂。我今年 16 岁,还不太会成为一名程序员,所以这绝对是我的理想之选。
【问题讨论】:
标签: javascript events highlight detect
我正在编写一个 Firefox 插件,只要突出显示一个单词就会触发它。但是,我需要一个脚本来检测何时突出显示单词,并且我被卡住了。一个例子是 nytimes.com(当您阅读一篇文章并突出显示一个单词时,参考图标会弹出)。但是 nytimes.com 脚本非常复杂。我今年 16 岁,还不太会成为一名程序员,所以这绝对是我的理想之选。
【问题讨论】:
标签: javascript events highlight detect
最简单的方法是检测文档上的mouseup 和keyup 事件并检查是否选择了任何文本。以下内容适用于所有主流浏览器。
示例: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;
【讨论】:
foo,而用户选择了foo,你怎么知道用户选择了哪些词?
foos) 是动态生成的,那么您可以为每个foo 提供一些唯一的ID,然后您可以使用window.getSelection().getRangeAt(0).startContainer.parentNode.id 来获取特定的@987654330 @ 的 ID。
keypress 事件上实现自定义 maxlength 功能,但是如果输入已经达到最大值,那么如果突出显示任何文本,按键仍然应该通过。您的功能完美地完成了这项工作
这是一个脚本:
<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>
由 Code Toad 提供:
http://www.codetoad.com/javascript_get_selected_text.asp
在您的情况下,您可能希望在进行选择时调用此脚本,然后您可以按照您的意愿处理它,例如使用 AJAX 请求来获取相关信息,就像 NYtimes 可能那样。
【讨论】:
window.getSelection() 返回一个 Selection 对象,而不是字符串。
Selection 对象确实具有合理的toString() 实现,但您的其余评论没有意义:如果window.getSelection 存在,则始终返回Selection 对象(在所有现代浏览器中都会这样做)。
就我而言,我希望能够突出显示一行中的文本并单击该行并将我发送到其他路线,例如“/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())
})
【讨论】: