2012-03-27 8 views
17

Czy możesz pomóc mi w wyróżnieniu wpisanych słów w polu autouzupełniania. Jestem już wypełnianie słów autouzupełniania i muszę po prostu podkreślić wpisywanych słów alone.i jestem nowy jQuery autouzupełnianiaJak wyróżnić słowa wejściowe w jquery autouzupełniania ui

Dostaję wyjście jako tekst jak <Strong>Br</Strong>ijesh // postrzegane jako tekst
a nie jako podkreślenie Tylko Br.

Poniżej znajduje się fragment

$(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 

Proszę mi pomóc.

+0

Jeszcze jedna uwaga. Używasz 'val' i' label' właściwości 'item', ale dokumentacja (patrz [tutaj] (http://wiki.jqueryui.com/w/page/12137709/Autocomplete) w części" Datamodel "opisuje że powinien to być "wartość" (nie "val") i "etykieta". – Oleg

Odpowiedz

28

Wydaje mi się, że należy zastąpić metodę _renderItem, aby uzyskać niestandardowe renderowanie elementów. Kod może być o co następuje:

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

W kodzie używam jQuery UI CSS "ui-state-highlight" na podkreślenie. Zamiast tego możesz użyć <strong>. Ponadto nie uwzględniam kodu, który mógłby uciec od jakichkolwiek znaków RegEx, które mogą znajdować się wewnątrz this.term. Chciałem ci tylko wyjaśnić główny pomysł. Zajrzyj na przykład pod numer the answer, aby uzyskać dodatkowe informacje.

AKTUALIZACJA: Nowsze wersje jQuery UI używa .data("ui-autocomplete") zamiast .data("autocomplete"). Aby dokonać kod pracy w obu (starych i nowych) wersji jQuery można zrobić coś jak poniżej:

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 2: W ten sam sposób nazwa "item.autocomplete" należy zmienić "ui-autocomplete-item". Zobacz here.

+0

@pal: Przy okazji, widzę, że wciąż nie skorzystałeś z prawa [voting] (http://stackoverflow.com/privileges/vote-up). Głosowanie jest głównym kryterium dla wyszukiwarki. Możesz głosować w górę około 30 pytań lub odpowiedzi ** dziennie ** (patrz [tutaj] (http://meta.stackexchange.com/a/5213/147495)). Więc głosując na pomocne informacje, które można znaleźć na stackoverflow, pomóż innym odwiedzającym znaleźć informacje. Polecam więc zacząć korzystać z prawa do głosowania. – Oleg

+0

'RegExp (this.term," gi ")' spowoduje dramatyzm (może rzucić błąd JavaScript), jeśli wyszukiwanym terminem jest wszystko, co można sparsować jako regex, szczególnie takie rzeczy jak nawiasy lub znak dolara. –

+0

@nness: Jeśli potrzebujesz zaznaczyć tylko tekst, możesz użyć '.toUpperCase(). IndexOf()', aby znaleźć podłańcuch 'this.term' w ciągu znaków' item.value'. Możesz użyć prostych suwaków JavaScript, aby wstawić ''. Alternatywnie możesz uciec od wszystkich znaków specjalnych * przed * wywołaniem 'RegEx' (patrz [odpowiedź] (http://stackoverflow.com/a/9168127/315935) na przykład). Główną ideą mojej starej odpowiedzi nie było dostarczenie idealnego rozwiązania, ale pokazanie, że można użyć niestandardowej implementacji '_renderItem' do renderowania elementów menu w niestandardowy sposób. – Oleg

2

Jeśli używasz nowego jQueryUI, należy wymienić to:

.data("autocomplete")._renderItem 

do tego:

.data("uiAutocomplete")._renderItem 
2

możemy również wdrożyć go w takim stanie.

$("#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

dla prawidłowego renderowania w jQuery UI - v1.12.1 używać "div", a nie "do"

$.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 = function (ul poz) { item.label = item.label.replace (new RegExp ("(?! [^ &;] +;) (?! < [^ <>] ) (" + $ .ui.autocomplete.escapeRegex (to .term) + ") (?! [^ <>]>) (?! [^ &;] +;)", "gi"), " "); return $ ("

  • ") .data ("item.autocomplete", pozycja) .append ("" + item.label + "") .appendTo (ul); };

    Użyj tej

    Powiązane problemy