2012-03-27 14 views
17

Podría ayudarme a poner de relieve las palabras escritas en el cuadro de texto de autocompletar. ya estoy poblando las palabras de autocompletar y tengo que acaba de poner de relieve las palabras escritas alone.i soy nuevo en jQuery autocompletadoCómo resaltar palabras de entrada en autocompletar jquery ui

que estoy recibiendo la salida como texto como <Strong>Br</Strong>ijesh // visto como texto
y no como destacando la Br solo.

A continuación se muestra el fragmento de

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

Por favor, ayúdame.

+0

Una observación más. Utiliza la propiedad 'val' y' label' de 'item', pero la documentación (ver [aquí] (http://wiki.jqueryui.com/w/page/12137709/Autocomplete) en la parte" Modelo de datos ") describe que debería ser 'value' (no' val') y 'label'. – Oleg

Respuesta

28

Me parece que debe sobrescribir el método _renderItem para tener una representación personalizada de los elementos. El código podría ser acerca de lo siguiente:

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

En el código que utiliza jQuery UI CSS "ui-estado-resalte" para poner de relieve. Puede usar <strong> en su lugar. Además, no incluyo el código que escaparía de los caracteres RegEx que podrían estar dentro de this.term. Solo quería explicarte la idea principal. Mira the answer por ejemplo para información adicional.

ACTUALIZADO: Más versiones recientes de jQuery UI utiliza .data("ui-autocomplete") en lugar de .data("autocomplete"). Para que el código de trabajo en versiones tanto (antiguos y nuevos) de jQuery que puede hacer algo como lo siguiente:

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); 
    }; 
} 

Actualizado hace 2: De la misma manera el nombre "item.autocomplete" debe cambiarse a "ui-autocomplete-item". Ver here.

+0

@pal: Por cierto, veo que todavía nunca usó su [votación] (http://stackoverflow.com/privileges/vote-up) derecha. La votación es el criterio principal para el motor de búsqueda. Puede votar aproximadamente 30 preguntas o respuestas ** por día ** (vea [aquí] (http://meta.stackexchange.com/a/5213/147495)). Entonces, al votar la información útil que encuentre en el stackoverflow, ayuda a otros visitantes a encontrar la información. Así que te recomiendo que comiences a utilizar tu derecho de voto. – Oleg

+0

'RegExp (this.term," gi ")' causará drama (puede arrojar un error de JavaScript) si el término de búsqueda es algo que podría ser analizado como expresión regular, particularmente cosas como corchetes o el signo de dólar. –

+0

@nness: si necesita resaltar simplemente el texto, puede usar '.toUpperCase(). IndexOf()' para ubicar la subcadena 'this.term' en la cadena' item.value'. Puede utilizar sunctions de cadena de JavaScript para insertar el ''. Alternativamente, puede escapar de todos los caracteres especiales * antes de la llamada de 'RegEx' (ver [la respuesta] (http://stackoverflow.com/a/9168127/315935) por ejemplo). La idea principal de mi antigua respuesta no era proporcionar la solución perfecta, sino simplemente mostrar que se puede usar la implementación personalizada de '_renderItem' para representar los elementos del menú de forma personalizada. – Oleg

2

Si está utilizando nueva jQueryUI, debe reemplazar esto:

.data("autocomplete")._renderItem 

a esto:

.data("uiAutocomplete")._renderItem 
2

también podemos implementarlo como este.

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

Para un correcto renderizado en jQuery UI - v1.12.1 utilizan "div", no "un"

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

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

    Utilice este

    Cuestiones relacionadas