2010-10-04 13 views
5

मान लीजिए कि पूरे दस्तावेज़ से जुड़ी mousestop घटना है, कर्सर के नीचे शब्द शब्द (यदि कोई पाठ है), तो माउस चलने से रोकता है, तो सबसे अच्छा तरीका क्या है?कर्सर के तहत शब्द कैसे प्राप्त करें?

मैं इवेंट हैंडलर से अंतर्निहित (jQuery) तत्व प्राप्त कर सकता हूं - $(document.elementFromPoint(e.clientX, e.clientY)) - लेकिन फिर अगला क्या है?

अब तक मेरा विचार हिट तत्व के भीतर सभी टेक्स्ट नोड्स को उनकी प्रतिलिपि के साथ प्रतिस्थापित करना है जहां प्रत्येक शब्द को डीओएम तत्व में लपेटा जाता है (अभी तक कौन सा पता नहीं है) और फिर उस तत्व को प्राप्त करने के लिए फिर से $(document.elementFromPoint(e.clientX, e.clientY)) पर कॉल करें माउस के नीचे शब्द।
लेकिन यह एक जटिल योजना की तरह लगता है और मुझे आश्चर्य है कि मुझे कुछ आसान याद आ रहा है या नहीं।

+0

[** अन्य प्रश्न **] से जवाब [http://stackoverflow.com/questions/2444430/how-to-get-a-word-under-cursor-using-javascript) मूल रूप से आप जो करते हैं प्रश्न में सुझाव देते हैं ... वे सिर्फ प्रत्येक शब्द को अपने तत्व में लपेटते हैं, और वहां से यह बहुत कठिन नहीं है ... - टेक्स्ट के मौजूदा स्टाइल को संरक्षित करते समय यह कैसे करना है इसके साथ समस्याएं हैं। –

+0

@ पीटर: स्टाइलिंग मुद्दे के लिए एक बहुत साफ समाधान है - अपना स्वयं का तत्व बनाएं। – artemave

उत्तर

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

प्रश्न में पहले से सुझाए गए सुझावों को दोहराता है मैंने प्रत्येक पाठ तत्व को लपेटने की कोशिश की टैग पहले से ही, लेकिन इससे आईफोन 3 जीएस (अधिक टेक्स्ट के साथ) पर खराब प्रदर्शन हुआ। तो, इसके बजाय हिट टेस्ट के समय टैग के साथ शब्दों को अस्थायी रूप से बदलने के लिए आपकी तकनीक का प्रयास कर रहा हूं ... –

1

मैं तुम्हारे लिए किसी भी कोड नहीं है, लेकिन शायद यह थोड़ी सी मदद की हो सकती है:

  1. जब कर्सर निष्क्रिय है, इसके बाद के संस्करण पर निर्देशांक प्राप्त पृष्ठ के भीतर तत्वों के लिए
  2. खोजें समन्वय
  3. तरह var s = getElementById('ElementIDFoundinStepAbove').innerHTML;

कुछ

  • का उपयोग करें कि एक काफी तार्किक दृष्टिकोण की तरह लगता है, फिर भी, मैं अगर यह बिल्कुल संभव है पता नहीं है।


    संपादित करें:

    मैं सिर्फ एस/ओ पर इस पोस्ट पाया है:

    2444430

    मुझे आशा है कि इस मदद करता है।

    :)

    जेसन

  • +0

    +1 वह धागा सबसे अच्छा शर्त जैसा दिखता है, बस उस पर ध्यान देना चाहता था क्योंकि यह –

    +0

    @bemace के जवाब में खड़ा नहीं है: सिवाय इसके कि यह – artemave

    संबंधित मुद्दे

     संबंधित मुद्दे