2011-05-04 9 views
13

मैंने हाल ही में एक HTML पृष्ठ के भीतर शब्दों को खोज और हाइलाइट करने के लिए कई पुस्तकालयों को देखा है। हालांकि, मैंने देखा कि प्रत्येक लाइब्रेरी में एक ही समस्या है, वे आंशिक रूप से HTML टैग में लगाए गए पाठ को नहीं ढूंढ सकते हैं और/या & -expressed विशेष वर्ण ढूंढने में वे असफल हो जाएंगे।एचटीएमएल में पूर्ण पाठ खोज टैग को अनदेखा कर रहा है/


उदाहरण एक:

<span> This is a test. This is a <b>test</b> too</span> 

"एक परीक्षण" की खोज की पहली घटना, लेकिन दूसरी नहीं पाते हैं।


उदाहरण ख:

<span> Pencils in spanish are called l&aacute;pices</span> 

"lápices" या "lapices" की खोज की एक परिणाम का उत्पादन करने के विफल हो जाएगा।


क्या कोई जेएस लाइब्रेरी है जो कम से कम इन बाधाओं को रोकने के लिए एक तरीका है?

अग्रिम में धन्यवाद!

ब्रूनो

+0

प्रयास करें [mark.js] (https://markjs.io), इसमें एक विकल्प 'overElements' – dude

उत्तर

30

आप आईई में window.find() गैर-आईई ब्राउज़र और TextRange की findText() विधि का उपयोग कर सकते हैं। यहाँ एक उदाहरण है:

http://jsfiddle.net/xeSQb/6/

दुर्भाग्य ओपेरा पिछले संस्करण के 15 में Blink प्रतिपादन इंजन के लिए स्विच करने के लिए या तो window.find या TextRange समर्थन नहीं करता।http://rangy.googlecode.com/svn/trunk/demos/textrange.html

कोड::

function doSearch(text) { 
    if (window.find && window.getSelection) { 
     document.designMode = "on"; 
     var sel = window.getSelection(); 
     sel.collapse(document.body, 0); 

     while (window.find(text)) { 
      document.execCommand("HiliteColor", false, "yellow"); 
      sel.collapseToEnd(); 
     } 
     document.designMode = "off"; 
    } else if (document.body.createTextRange) { 
     var textRange = document.body.createTextRange(); 
     while (textRange.findText(text)) { 
      textRange.execCommand("BackColor", false, "yellow"); 
      textRange.collapse(false); 
     } 
    } 
} 
+0

एक आकर्षण की तरह काम किया है। यदि कई परिणाम हैं तो सीमाओं पर पुनरावृत्ति थोड़ी धीमी हो सकती है, लेकिन मुझे नहीं लगता कि यह एक बड़ी समस्या होगी, साथ ही यह वही है जो मुझे चाहिए। दो अंगूठे उपर। – Bruno

+1

इस कोड में एक (बहुत) मामूली दोष यह है कि यह वर्तमान कर्सर की स्थिति से आगे की खोज करता है, इसलिए यदि कोई उपयोगकर्ता टेक्स्ट का एक टुकड़ा हाइलाइट करता है और बटन क्लिक करता है, तो खोज उपयोगकर्ता के हाइलाइट के बाद शुरू होती है। आदर्श रूप से खोजने से पहले() कॉल कर्सर को शीर्ष पर ले जाने के लिए किसी प्रकार का कॉल होना चाहिए। – Bruno

+0

@ ब्रूनो: अच्छा बिंदु। मैं अब जोड़ दूंगा ... –

0

यहां 2 समस्याएं हैं। एक नेस्टेड सामग्री समस्या है, या खोज मिलान जो तत्व सीमा फैलता है। दूसरा एचटीएमएल से बचने वाले पात्र हैं।

एचटीएमएल से बचने वाले पात्रों को संभालने का एक तरीका यह है कि, यदि आप उदाहरण के लिए jQuery का उपयोग कर रहे हैं, तो .text() विधि का उपयोग करने के लिए, और उस पर खोज चलाएं। उस पाठ से वापस आने वाले पाठ में पहले से ही बचने वाले पात्रों को उनके वास्तविक चरित्र में "अनुवादित" किया गया है।

उन विशेष पात्रों को संभालने का एक और तरीका बच निकले संस्करण के साथ वास्तविक चरित्र (खोज स्ट्रिंग में) को प्रतिस्थापित करना होगा। चूंकि वहां कई प्रकार की संभावनाएं हैं, हालांकि, कार्यान्वयन के आधार पर यह एक लंबी खोज हो सकती है।

उसी प्रकार की "टेक्स्ट" विधि का उपयोग सामग्री मिलानों को प्राप्त करने के लिए किया जा सकता है जो इकाई सीमाओं को फैलाता है। यह ट्रिकियर हो जाता है क्योंकि "टेक्स्ट" में कोई धारणा नहीं है कि सामग्री के वास्तविक भाग कहां से आते हैं, लेकिन यह आपको ड्रिल करने पर खोज करने के लिए एक छोटा डोमेन देता है। एक बार जब आप नज़दीक हो जाते हैं, तो आप एक पर स्विच कर सकते हैं शब्द-आधारित खोज की बजाय अधिक "पात्रों की श्रृंखला" खोज की तरह।

मुझे ऐसा कुछ पुस्तकालयों के बारे में पता नहीं है जो ऐसा करते हैं।

-2

बस प्रेस यह आपके लिए एक चिंता का विषय है, तो एक नहीं बल्कि दिग्गज विकल्प निम्नलिखित डेमो में के रूप में, मेरे Rangy पुस्तकालय की TextRange और CSS class applier मॉड्यूल के संयोजन का उपयोग करने के लिए है एफ 3 और अपनी साइट पर दूसरों को बताने के लिए <p> और </p> कमांड का उपयोग करें। उदाहरण के लिए: आप .. F3 खोज बटन का ज्ञान तो स्क्रीन के पाठ को डाल करने के लिए दूसरों को आप टाइप करेंगे बताने के लिए है

<p><h4>If your having trouble finding something press F3 to highlight the text<h4></p> 
संबंधित मुद्दे