2010-10-04 42 views
5

假设有附加到整个文档mousestop事件,究竟是要弄清楚光标下的精确的最佳方式(如果有任何文本),当鼠标停止移动?如何让光标下的单词?

我可以从事件处理底层(jQuery的)元素 - $(document.elementFromPoint(e.clientX, e.clientY)) - 但是未来是什么?

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

+0

从这些问题的答案[**其他问题**](http://stackoverflow.com/questions/2444430/how-to-get-a-word-under-cursor-using-javascript)基本上做什么你在问题中提出建议......他们只是将每个单词都包裹在自己的元素中,并且从那里开始并不难...... - 在保留现有文本样式的同时如何做到这一点存在问题。 – 2010-10-04 19:37:23

+0

@Peter:对造型问题有一个非常整洁的解决方案 - 组成你自己的元素。 – artemave 2010-10-04 22:05:02

回答

2

好了,没有魔术为止,所以这里是呆板枯燥的(然而工作)解决方案:

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

很少有涉及的其他微妙之处(像事件'降低噪音',保持替换的上下文(如选择)等等),但你明白了。

Here你可以学习如何建立mousestop事件。

编辑:

制作自定义HTML元素可能无法在IE(谁曾想到?)海峡前进。查看更多here

+0

这个问题中提出的内容外,我尝试将每个文本元素在标签之前,但这导致了一个糟糕的表现在iPhone 3GS(有很多文字)。所以,相反,我正在尝试用你的技术来暂时用点击测试时的标签替换单词...... – 2012-05-16 09:50:41

1

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

  1. 当光标处于空闲状态,得到坐标
  2. 对页面元素搜索在上述坐标
  3. 使用类似var s = getElementById('ElementIDFoundinStepAbove').innerHTML;

这似乎是一个相当合理的方法,但是,我不知道这是在所有可能的。


编辑:

我刚刚发现了S/O这篇文章:

2444430

我希望这有助于。

:)

杰森

+0

+1该线程看起来像是最好的赌注,只是想引起注意,因为它在回答中并不突出 – 2010-10-05 21:16:50

+0

@bemace:除了它重复已在 – artemave 2010-10-06 21:49:41