繁体   English   中英

检测在文本中右键单击了哪个词

[英]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上运行。

JSFiddle演示。

这是主要更改:

$(".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();
   }
});

更新

此更新旨在解决滚动页面问题以及第一个和最后一个单词选择错误。

新的JSFiddle。

$('.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(); 
    }
});

在完全重新单击之前,您需要花更多时间在此重新考虑上。

为什么?:辅助功能和用户体验:

  • 右键单击在移动设备上的访问程度不同
  • 大多数Mac用户只有一个按钮鼠标,因此很少使用右键单击。

如果您仍然热衷于右键单击,请参阅以下线程,其中包含有关右键单击事件的一些有用讨论:

右键单击Javascript事件吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM