如何获取光标下的单词?

Posted

技术标签:

【中文标题】如何获取光标下的单词?【英文标题】:How to get word under cursor? 【发布时间】:2011-04-20 19:09:10 【问题描述】:

假设有一个 mousestop 事件附加到整个文档,当鼠标停止时,找出光标下确切的 单词 的最佳方法是什么(如果有任何文本)搬家?

我可以从事件处理程序中获取底层 (jQuery) 元素 - $(document.elementFromPoint(e.clientX, e.clientY)) - 但接下来是什么?

到目前为止,我的想法是用它们的副本替换命中元素中的所有文本节点,其中每个单词都包含在一个 DOM 元素中(还不知道是哪个),然后再次调用 $(document.elementFromPoint(e.clientX, e.clientY)) 以获取包含的元素只有鼠标下的单词。 但这似乎是一个复杂的计划,我想知道我是否遗漏了一些更简单的东西。

【问题讨论】:

[ 另一个问题 ](***.com/questions/2444430/…) 的答案基本上按照您在问题中的建议进行......他们只是将每个单词包装在自己的元素中,并且从那里开始并不太难...... - 在保留现有文本样式的同时如何做到这一点存在问题。 @Peter:样式问题有一个非常巧妙的解决方案——组成你自己的元素。 【参考方案1】:

好吧,到目前为止还没有魔术,所以这是一个无聊(但有效)的解决方案:

  $(document.body).mousemove(function(e)

    var onmousestop = function() 
      function getHitWord(hit_elem) 
        var hit_word = '';
        hit_elem = $(hit_elem);

        //text contents of hit element
        var text_nodes = hit_elem.contents().filter(function()
          return this.nodeType == Node.TEXT_NODE && this.nodeValue.match(/[a-zA-Z]2,/)
        );

        //bunch of text under cursor? break it into words
        if (text_nodes.length > 0) 
          var original_content = hit_elem.clone();

          //wrap every word in every node in a dom element
          text_nodes.replaceWith(function(i) 
            return $(this).text().replace(/([a-zA-Z-]*)/g, "<word>$1</word>")
          );

          //get the exact word under cursor
          var hit_word_elem = document.elementFromPoint(e.clientX, e.clientY);

          if (hit_word_elem.nodeName != 'WORD') 
            console.log("missed!");
          
          else  
            hit_word = $(hit_word_elem).text();
            console.log("got it: "+hit_word);
          

          hit_elem.replaceWith(original_content);
        

        return hit_word;
      

      var hit_word = getHitWord(document.elementFromPoint(e.clientX, e.clientY));
      ...
    
  

几乎没有其他微妙之处(例如事件“降噪”、保持替换的 dom 上下文(例如选择)等),但您明白了。

Here你可以学习如何设置mousestop事件。

编辑:

在 IE 中制作自定义 html 元素可能不是那么困难(谁会想到?)。查看更多here。

【讨论】:

我事先尝试将每个文本元素包装在 标签中,但这会导致 iPhone 3GS 的性能不佳(文本过多)。因此,我尝试使用您的技术在命中测试时暂时用标签替换单词...【参考方案2】:

我没有任何代码给你,但也许这可能有点帮助:

    光标空闲时,获取坐标 在上述坐标处搜索页面内的元素 使用类似var s = getElementById('ElementIDFoundinStepAbove').innerHTML;

这似乎是一个相当合乎逻辑的方法,但是,我不知道这是否可能。


编辑:

我刚刚在 S/O 上找到了这篇文章:

2444430

我希望这会有所帮助。

:)

杰森

【讨论】:

+1 该线程看起来是最好的选择,只是想引起人们的注意,因为它在答案中并不突出 @bemace:除了它重复了问题中已经建议的内容

以上是关于如何获取光标下的单词?的主要内容,如果未能解决你的问题,请参考以下文章

codemirror - 获取光标下的当前单词

如何替换光标下的单个单词?

如何获取 QTableWidget 光标下的行

在 Emacs 中获取光标下的字体

如何通过快捷方式在 Kate 中选择光标位置下的单词?

UITextField获取当前编辑的单词