Configuración de búsqueda de widget de Autocompletar jQuery UI


Estoy buscando usar el widget jQuery UI autocomplete para implementar la búsqueda de usuarios por nombre o apellido. Parece que por defecto autocompletar busca palabras por secuencia de caracteres sin importar su ocurrencia en una palabra. Así que si tienes datos como: javascript, asp, haskell y escribes 'as' obtendrás los tres. Me gustaría que solo coincida con el principio de la palabra. Así que en el ejemplo anterior solo obtienes 'asp'. ¿Hay alguna forma de configurar el widget autocompletar para hacer esto?

En última instancia, sería incluso mejor que coincidiera al principio del nombre o apellido como en Gmail.

Nota: Estoy tratando de encontrar una manera de hacer esto usando el widget de interfaz de usuario de jQuery específicamente. Dado que ya estoy usando jQuery UI en mi proyecto, estoy planeando seguir con ella e intentar no agregar bibliotecas adicionales a mi aplicación web.

Author: Community, 2010-03-04

6 answers

En jQuery UI v1.8rc3, el widget autocompletar acepta una opción source que puede ser una cadena, una matriz o una función de devolución de llamada. Si es una cadena, autocompletar hace un GET en esa URL para obtener opciones / sugerencias. Si una matriz, autocompletar hace una búsqueda, como usted señaló, para la presencia de los caracteres escritos en cualquier posición en los términos de la matriz. La variante final es lo que quieres - la función de devolución de llamada.

De la documentación de autocompletar:

La tercera variación, la devolución de llamada, proporciona la mayor flexibilidad, y se puede utilizar para conectar cualquier fuente de datos a Autocompletar. La devolución de llamada recibe dos argumentos:

• Un objeto request, con una sola propiedad llamada "term", que se refiere al valor actualmente en la entrada de texto. Por ejemplo, cuando el usuario ingresa "nuevo yo" en un campo de ciudad que está configurado para hacer autocompletar, el request.term mantendrá "nuevo yo".
* Una función response, una devolución de llamada que espera una argumento para contener los datos a sugerir al usuario. Estos datos deben filtrarse en función del término proporcionado, y deben ser una matriz en el formato permitido para datos locales simples: Matriz de cadena o Matriz de objeto con etiqueta/valor/ambas propiedades.

Código de ejemplo:

var wordlist= [ "about", "above", "across", "after", "against",
                "along", "among", "around", "at", "before", 
                "behind", "below", "beneath", "beside", "between", 
                "beyond", "but", "by", "despite", "down", "during", 
                "except", "for", "from", "in", "inside", "into", 
                "like", "near", "of", "off", "on", "onto", "out", 
                "outside", "over", "past", "since", "through", 
                "throughout", "till", "to", "toward", "under", 
                "underneath", "until", "up", "upon", "with", 
                "within", "without"] ; 

$("#input1").autocomplete({
    // The source option can be an array of terms.  In this case, if
    // the typed characters appear in any position in a term, then the
    // term is included in the autocomplete list.
    // The source option can also be a function that performs the search,
    // and calls a response function with the matched entries.
    source: function(req, responseFn) {
        var re = $.ui.autocomplete.escapeRegex(req.term);
        var matcher = new RegExp( "^" + re, "i" );
        var a = $.grep( wordlist, function(item,index){
            return matcher.test(item);
        });
        responseFn( a );
    }
});

Algunos puntos clave:

  • la llamada a $.ui.autocomplete.escapeRegex(req.term); Que escapa el término de búsqueda de modo que cualquier término con significado regular en el texto escrito por el usuario se trate como texto sin formato. Por ejemplo, el punto (.) es significativo para regex. Aprendí de esta función escapeRegex leyendo el código fuente de autocompletar.
  • la línea con new Regexp(). Especifica una regexp que comienza con ^ (Circumflex), lo que implica que solo coincidirá cuando los caracteres escritos aparezcan al principio del término en la matriz, que es lo que quería. También utiliza la opción " i " que implica una coincidencia insensible a mayúsculas y minúsculas.
  • la utilidad $.grep() solo llama a la función proporcionada en cada término en el arreglo proporcionado. La función en este caso simplemente usa la expresión regular para ver si el término en la matriz coincide con lo que se escribió.
  • finalmente, el responseFn() es invocado con el resultado de la búsqueda.

Demostración de trabajo: http://jsbin.com/ezifi

Cómo se ve:

texto alt

Solo una nota: Encuentro que la documentación sobre autocompletar es bastante inmadura en este punto. No encontré ejemplos que hicieran esto, y no pude encontrar trabajo doc en cuál .los archivos css eran necesarios o que .se usarían clases CSS. Aprendí todo esto al inspeccionar el código.

Véase también, ¿cómo puedo personalizar el formato de los resultados del complemento de Autocompletar?

 125
Author: Cheeso,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-27 14:44:04

Utilizo el autocompletado de devbridge. http://www.devbridge.com/projects/autocomplete/jquery /

Solo coincide con los caracteres iniciales.

Texto alternativo http://i46.tinypic.com/2ihq7pd.jpg

En cuanto a la coincidencia basada en el nombre o el apellido, solo tendría que proporcionar una lista de búsqueda con el nombre y el apellido.

Ejemplo de uso:

  var wordlist = [
      'January', 'February', 'March', 'April', 'May', 'June',
      'July', 'August', 'September', 'October', 'November',
      'December' ]; 

      var acOptions = {
          minChars:2,
          delimiter: /(,|;)\s*/, // regex or character
          maxHeight:400,
          width:300,
          zIndex: 9999,
          deferRequestBy: 10, // miliseconds

          // callback function:
          onSelect: function(value, data){
              //$('#input1').autocomplete(acOptions);
              if (typeof data == "undefined") {
                  alert('You selected: ' + value );
              }else {
                  alert('You selected: ' + value + ', ' + data);
              }
          },

          // local autosuggest options:
          lookup: wordlist
      };

La opción lookup que pasa para inicializar el control de autocompletar puede ser una lista, o un objeto. Lo anterior mostró una lista simple. Si desea algunos datos adjuntos a las sugerencias que se devuelven, haga que la opción lookup sea un objeto, como este:

var lookuplist = {
    suggestions:   [ "Jan", "Feb", "Mar", "Apr", "May" ],
    data :         [ 31, 28, 31, 30, 31, ]
};
 6
Author: Cheeso,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-03-04 21:11:48

Thx queso para intruir jsbin.com,

Extendí su código para soportar las coincidencias de first - and lastname, también.

  $("#input1").autocomplete({
      source: function(req, responseFn) {
          addMessage("search on: '" + req.term + "'<br/>");

          var matches = new Array();
          var needle = req.term.toLowerCase();

          var len = wordlist.length;
          for(i = 0; i < len; ++i)
          {
              var haystack = wordlist[i].toLowerCase();
              if(haystack.indexOf(needle) == 0 ||
                 haystack.indexOf(" " + needle) != -1)
              {
                  matches.push(wordlist[i]);
              }
          }

          addMessage("Result: " + matches.length + " items<br/>");
          responseFn( matches );
      }
  });

Demo: http://jsbin.com/ufimu3 /

Escriba 'an'o' re '

 5
Author: Phil Rykoff,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-03-08 23:45:27

Si desea buscar el comienzo de cada palabra en la cadena, una solución más elegante para esbirros es tomar cheeso, pero solo use el carácter especial de límite de la palabra regexp:

var matcher = new RegExp( "\\b" + re, "i" );

Ejemplo: http://jsbin.com/utojoh/2 (intenta buscar 'bl')

 2
Author: Nader,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-08-16 17:07:52

Hay otro complemento de autocompletar de jQuery que opcionalmente busca justo al inicio de cada elemento (la opción es matchContains=false, Creo que ese es el valor predeterminado también).

Dada la ausencia de tal opción en el plugin jQuery UI, supongo que tendrás que usar un plugin diferente, o reescribir el que estás usando ahora.

 0
Author: Paul D. Waite,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-03-08 15:22:18

¿De dónde sacas los datos para rellenar el autocompletado? ¿Es de una base de datos? Si es así, puede hacer lo que desee en su consulta y solo devolver resultados que coincidan con el comienzo de cada palabra (nombre/apellido)

 0
Author: Mark,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-03-08 16:29:23