Estoy tratando de crear un genérico de autocompletar secuencia de comandos mediante jQueryUI. La función de autocompletar debe trabajar para todos:

<input type='text' class='autocomplete' id='foo'/>
<input type='text' class='autocomplete' id='bar'/>
...

Ahora estoy tratando de acceder a ‘foo’ o ‘bar’ en el origen de la función con $(this), pero cuando se alerta siempre me sale «indefinido».

$('input.autocomplete').autocomplete({
    source: function(req, add){
        var id = $(this).attr('id');
        alert(id);
    }
});

¿Qué estoy haciendo mal?

  • ¿Cuál es la intención? Para elegir una fuente basada en la identificación de los seleccionados de autocompletar?
  • Él quiere hacer un genérico func para autocompletar en cualquier campo id es pasado.
  • gracias, pero eso no aclarar. Te «ayuda» al igual que a menudo? ¿Por qué él tiene que elegir la fuente basada en el elemento de la función de autocompletar está conectado? Suena como que necesita para crear el codeblock una vez para cada uno de autocompletar elemento, o una vez por cada tipo de codeblock. Esta no es la manera de hacer SECA, por poner un bloque if dentro de un control de origen de la definición de la estructura. Hace más de un código complejo.
  • Usando el ID del campo de entrada puedo determinar el lado del servidor que los valores de retorno. Sí, este es un SECO intento.
  • ¿»Comentario» al igual que a menudo? Obviamente, la función de autocompletar de la lista de origen tiene que coincidir con el tipo de datos esperado en un determinado elemento. Él hace esto pasa en el id. Sin ver su diseño completo, no creo que se justifique un comentario en el aspecto SECO. Esto es claramente un ejemplo simplificado para nuestro beneficio.
  • Pensé que era bastante evidente a partir de lo que él estaba haciendo que él estaba tratando de SECAR. Y sí, tengo que hacerlo. Como para @bart he encontrado que, personalmente y con la mayoría de los programadores sé, SECO se encuentra escribiendo un par de bloques de código, inicialmente, y luego buscando las repetidas partes. En este caso, el jQueryUI de autocompletar no está preparado para hacer lo que quieres, y te terminan repitiendo sólo un par de cosas en general, dada la información que he visto hasta ahora. Hacer de cada uno un bloque separado completamente, o hacer como sugerido por @lee

InformationsquelleAutor bart | 2010-11-28

4 Comentarios

  1. 57

    Configuración de autocompletar por separado para cada artículo en su selección, el uso de un cierre para mantener una referencia al elemento relevante. Algo parecido a lo siguiente:

    $('input.autocomplete').each(function(i, el) {
        el = $(el);
        el.autocomplete({
            source: function(req, add) {
                var id = el.attr('id');
                alert(id);
            }
        });
    });

    Alternativa (editar)

    No veo por qué hay tanta resistencia al uso each(): funciona, el código es muy claro y legible, y se introduce sin problemas con eficiencia, pero si estás decidido a evitar each(), aquí tienes una alternativa…

    *Por FAVOR NOTA: el siguiente enfoque se basa (un poco) en el interior de jQuery Autocomplete, así que te recomiendo la primera opción… pero la elección es tuya.

    $('input.autocomplete').autocomplete({
            source: function(req, add) {
                var id = this.element.attr('id');
                alert(id);
            }
        });
    });

    Que va a funcionar, al menos hasta que/a menos que cambie la forma en que el source() se llama a la función desde dentro de la autocomplete plugin.

    Es así, usted tiene dos opciones… algo para todo el mundo.

    • atención a elaborar? mi solución será de trabajo.
    • Es posible que funcione, pero creo que cada una es mala forma aquí. Mirando la fuente ahora para ver si hay una opción mejor.
    • Sólo probado y funciona. No estoy seguro todavía de si esta es la mejor solución.
    • Yo sé que funciona, yo creo que es simplemente mala forma. Sin embargo, la mala forma puede ser de su parte, no en @lee, si eso tiene sentido. Usted se dará respuesta a mi pregunta de arriba?
    • Sin cortar el camino de autocompletar de la interfaz está diseñada para el trabajo, este se ve bien. Si un hack es utilizado, sería más frágil que la de este.
    • No hay ningún problema con el uso de la each() — en mi humilde opinión, hace que sea muy claro lo que hace el código, y no produce efectos secundarios indeseables. Dicho esto, he publicado otra opción que no uso each(). La segunda opción no confiar un poco en la parte interna de jQuery Autocomplete, así que te recomiendo la primera opción… pero es su elección.
    • Aun no puedo ver lo que está mal con el uso de each() aquí. Estoy usando una versión heredada de la autocomplete de la biblioteca, y el uso de each() es la única opción que me funciona, ya que la biblioteca no tiene el source() método.

  2. 3

    Para tener acceso a ese elemento de entrada debe ser capaz de hacer lo siguiente:

    $(this.element).val();

    Por supuesto, que sólo obtiene el valor. Usted puede acceder a los otros atributos como:

    $(this.element).attr('value'); //just another way to get the value
    $(this.element).attr('id');

    También, suponga que desea para acceder a ese elemento en la seleccione el evento, puedes hacerlo así:

    $(event.target).attr('value');
    $(event.target).attr('id');
  3. 0

    $(this) vendrá de su recién creado función y por lo tanto no funciona. Mueva su id declaración sobre source y debería funcionar.

    • él no puede poner $(this) por encima de la «fuente» como que poner en la lista de opciones, no se muy bien lo que quiere.
  4. 0

    Marwelin es correcta. ‘este’ hará referencia a la recién creada función anidada dentro. Esto es fácilmente corregible mediante la creación de la var id fuera de la función y el uso de ella dentro de la función.

Dejar respuesta

Please enter your comment!
Please enter your name here