2012-03-27 17 views
17

में इनपुट शब्दों को हाइलाइट करने के लिए कैसे करें आप ऑटो पूर्ण टेक्स्ट बॉक्स में टाइप किए गए शब्दों को हाइलाइट करने में मेरी सहायता कर सकते हैं। मैं पहले से ही स्वत: पूर्ण शब्द को आबाद करने कर रहा हूँ और मैं सिर्फ लिखे गए शब्द अकेले jQuery के स्वत: पूर्ण करने के लिए नया हूँ उजागर करने के लिएस्वत: पूर्ण jquery ui

मैं <Strong>Br</Strong>ijesh की तरह पाठ के रूप में उत्पादन हो रही है // पाठ
रूप पर प्रकाश डाला रूप में नहीं देखा और जरूरत अकेले ब्र

नीचे टुकड़ा

$(document).ready(function() { 
$("#studentName").autocomplete({ 
    source: function (request, response) { 
     $.ajax({ 
      type: "POST", 
      contentType: "application/json; charset=utf-8", 
      url: "Webservice.asmx/GetStudentNames", 
      data: "{'prefixText':'" + request.term + "'}", 
      dataType: "json", 
      success: function (data) { 
      var regex = new RegExp("(?![^&;]+;)(?!<[^<>]*)(" + request.term.replace(/([\^\$\(\)\[\]\{\}\*\.\+\?\|\\])/gi, "\\$1") + ")(?![^<>]*>)(?![^&;]+;)", "gi"); 
       response($.map(data.d, function (item) { 
        return { 
        label: item.split('|')[0].replace(regex, "<Strong>$1</Strong>"), 
        val: item.split('|')[1] 
        } 
       })) 
      }, 

      failure: function (response) { 
       ServiceFailed(result); 
      } 
     }); 
    }, 
    select: function (event, ui) { 
    txtStudent(ui.item.val, ui.item.label); //Student name and id used in this method 
    }, 
    minLength: 2 
}); 
});    // End of ready method 

मेरी मदद कृपया है।

+0

का उपयोग करें एक और टिप्पणी। आप 'आइटम' की' वैल' और 'लेबल' प्रॉपर्टी का उपयोग करते हैं, लेकिन दस्तावेज (देखें [यहां] (http://wiki.jqueryui.com/w/page/12137709/Autocomplete) "डेटामोडेल" भाग में) वर्णन करता है कि यह 'मान' होना चाहिए (' वैल' नहीं) और 'लेबल' होना चाहिए। – Oleg

उत्तर

28

ऐसा लगता है कि आपको आइटम की कस्टम प्रतिपादन के लिए _renderItem विधि को ओवरराइट करना चाहिए। कोड निम्नलिखित के बारे में हो सकता है:

$("#studentName").autocomplete({/* all your parameters*/}) 
    .data("autocomplete")._renderItem = function (ul, item) { 
     var newText = String(item.value).replace(
       new RegExp(this.term, "gi"), 
       "<span class='ui-state-highlight'>$&</span>"); 

     return $("<li></li>") 
      .data("item.autocomplete", item) 
      .append("<a>" + newText + "</a>") 
      .appendTo(ul); 
    }; 

कोड में मैं पर प्रकाश डाला के लिए jQuery यूआई सीएसएस "ui-राज्य के मुख्य आकर्षण" का उपयोग करें। आप इसके बजाय <strong> का उपयोग कर सकते हैं। इसके अलावा मुझे उस कोड को शामिल नहीं किया गया है जो RegEx वर्णों से बच जाएगा जो this.term के अंदर हो सकता है। मैं आपको केवल मुख्य विचार समझाऊंगा। अतिरिक्त जानकारी के लिए उदाहरण के लिए the answer देखें।

UPDATED: अधिक jQuery यूआई के हाल के संस्करणों .data("ui-autocomplete") बजाय .data("autocomplete") उपयोग करता है। अपने कोड jQuery के दोनों (पुराने और नए) संस्करणों में काम करने के लिए आप निम्नलिखित की तरह कुछ कर सकते हैं:

var $elem = $("#studentName").autocomplete({/* all your parameters*/}), 
    elemAutocomplete = $elem.data("ui-autocomplete") || $elem.data("autocomplete"); 
if (elemAutocomplete) { 
    elemAutocomplete._renderItem = function (ul, item) { 
     var newText = String(item.value).replace(
       new RegExp(this.term, "gi"), 
       "<span class='ui-state-highlight'>$&</span>"); 

     return $("<li></li>") 
      .data("item.autocomplete", item) 
      .append("<a>" + newText + "</a>") 
      .appendTo(ul); 
    }; 
} 

UPDATED: उसी तरह नाम "item.autocomplete""ui-autocomplete-item" को बदला जाना चाहिए। here देखें।

+0

@pal: जिस तरह से मैं देखता हूं कि आपने अभी भी अपने [मतदान] (http://stackoverflow.com/privileges/vote-up) का उपयोग कभी नहीं किया है। खोज इंजन के लिए वोटिंग मुख्य मानदंड है। आप लगभग 30 प्रश्न या उत्तर ** प्रति दिन ** वोट कर सकते हैं (देखें [यहां] (http://meta.stackexchange.com/a/5213/147495))। तो स्टैक ओवरफ्लो पर आपको जो उपयोगी जानकारी मिलती है, उसे वोट करके आप अन्य आगंतुकों को जानकारी ढूंढने में मदद करते हैं। इसलिए मैं आपको अपने मतदान अधिकार का उपयोग शुरू करने की सलाह देता हूं। – Oleg

+0

'RegExp (this.term," gi ") 'नाटक का कारण बनता है (जावास्क्रिप्ट त्रुटि फेंक सकता है) यदि खोज शब्द कुछ भी है जिसे रेगेक्स के रूप में पार्स किया जा सकता है, विशेष रूप से ब्रैकेट या डॉलर चिह्न जैसी चीजें। –

+0

@nness: यदि आपको केवल टेक्स्ट को हाइलाइट करने की आवश्यकता है तो आप स्ट्रिंग 'item.value' में substing' this.term' का पता लगाने के लिए '.toUpperCase()। IndexOf()' का उपयोग कर सकते हैं। आप '' डालने के लिए सरल जावास्क्रिप्ट स्ट्रिंग सूर्यों का उपयोग कर सकते हैं। वैकल्पिक रूप से आप 'RegEx' के कॉल * से पहले सभी विशेष पात्रों से बच सकते हैं (देखें [उत्तर] (http://stackoverflow.com/a/9168127/315935) उदाहरण के लिए)। मेरे पुराने उत्तर का मुख्य विचार सही समाधान प्रदान नहीं कर रहा था, लेकिन केवल यह दिखा रहा है कि कस्टम तरीके से मेनू आइटम प्रस्तुत करने के लिए '_renderItem' के कस्टम कार्यान्वयन का उपयोग किया जा सकता है। – Oleg

2

आप नए jQueryUI का उपयोग कर रहे हैं, तो आप इस बदलना चाहिए:

.data("autocomplete")._renderItem 
इस के लिए

:

.data("uiAutocomplete")._renderItem 
2

हम भी इस तरह इसे लागू कर सकते हैं।

$("#studentName").autocomplete({/* all your parameters*/}); 
    $.ui.autocomplete.prototype._renderItem = function (ul, item) {   
     var t = String(item.value).replace(
       new RegExp(this.term, "gi"), 
       "<span class='ui-state-highlight'>$&</span>"); 
     return $("<li></li>") 
      .data("item.autocomplete", item) 
      .append("<a>" + t + "</a>") 
      .appendTo(ul); 
    }; 
2

एक सही के लिए jQuery UI में प्रस्तुत करना - v1.12.1 "div", नहीं "एक"

$.ui.autocomplete.prototype._renderItem = function (ul, item) {   
    var t = String(item.value).replace(
      new RegExp(this.term, "gi"), 
      "<strong>$&</strong>"); 
    return $("<li></li>") 
     .data("item.autocomplete", item) 
     .append("<div>" + t + "</div>") 
     .appendTo(ul); 
}; 
0

$ .ui.autocomplete.prototype._renderItem = फ़ंक्शन का उपयोग करें (उल, आइटम) { item.label = item.label.replace (नया RegExp ("(?! [^ &;] +;) (?! < [^ <>] ) (" + $ .ui.autocomplete.escapeRegex (यह .term) + ") (?! [^ <>]>) (?! [^ &;] +;)", "जीआई"), "$ 1 "); $ ("

  • " .डेटा ("item.autocomplete", आइटम) .append ("" + item.label + "") ।appendTo (उल); };

    इस