[英]Detect which word has been right-clicked on within a text
对于我的应用程序,我想在有人单击右键时显示一个自定义上下文菜单。 如果右键单击任何单词,我想显示一些其他选项。 我在网上查了一下,找到了解决方案,以解决在单击鼠标左键时如何获得该单词的问题,我尝试对其进行修改以进行右键单击,但是某种程度上它无法正常工作。
下面的代码在单击鼠标左键时会显示带有该单词的警报,而在单击鼠标右键时,它会执行相同的操作。 但是有时它不会显示任何弹出窗口,而当它在弹出窗口中显示单词时,会显示前一个右键单击的单词。
$('.text123').click(function(e){
s = window.getSelection();
var range = s.getRangeAt(0);
var node = s.anchorNode;
while(range.toString().indexOf(' ') != 0) {
range.setStart(node,(range.startOffset -1));
}
range.setStart(node, range.startOffset +1);
do{
range.setEnd(node,range.endOffset + 1);
}while(range.toString().indexOf(' ') == -1 && range.toString().trim() != '');
var str = range.toString().trim();
alert(str);
});
$(".text123").mouseup(function(){
var e = window.event;
if (e.button == 2)
{
jQuery(document.elementFromPoint(e.pageX, e.pageY)).click();
}
});
我要在Edge浏览器上进行测试,因为我想在UWP应用中使用代码。
经过一些搜索和测试后,这似乎可以在EDGE上运行。
这是主要更改:
$(".text123").on('contextmenu', function(evt){
evt.preventDefault(); // with this the context menu will not open
var e = window.event;
if (e.button == 2) {
/* START - And this make the selection before emulate the left click */
var range = document.caretRangeFromPoint(e.pageX, e.pageY);
var selection = window.getSelection();
selection.removeAllRanges();
selection.addRange(range);
/* END */
jQuery(document.elementFromPoint(e.pageX, e.pageY)).click();
}
});
更新
此更新旨在解决滚动页面问题以及第一个和最后一个单词选择错误。
$('.text123').click(function(e) {
s = window.getSelection();
var range = s.getRangeAt(0);
var node = s.anchorNode;
// ### && range.startOffset != 0 <--- This check very first char
while (range.toString().indexOf(' ') != 0 && range.startOffset != 0) {
range.setStart(node, (range.startOffset - 1));
}
range.setStart(node, range.startOffset + 1);
do {
range.setEnd(node, range.endOffset + 1);
} while (range.toString().indexOf(' ') == -1 && range.toString().trim() != '' && range.endOffset < range.endContainer.length);
// ### && range.endOffset < range.endContainer.length <--- This check the last char
var str = range.toString().trim();
alert(str);
});
$(".text123").on('contextmenu', function(evt) {
evt.preventDefault();
var e = window.event;
if (e.button == 2) {
// ### - $(document).scrollTop() <--- This will fix the page scroll
var range = document.caretRangeFromPoint(e.pageX, e.pageY - $(document).scrollTop());
var selection = window.getSelection();
selection.removeAllRanges();
selection.addRange(range);
// ### - $(document).scrollTop() <--- This will fix the page scroll
jQuery(document.elementFromPoint(e.pageX, e.pageY - $(document).scrollTop())).click();
}
});
在完全重新单击之前,您需要花更多时间在此重新考虑上。
为什么?:辅助功能和用户体验:
如果您仍然热衷于右键单击,请参阅以下线程,其中包含有关右键单击事件的一些有用讨论:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.