2010-11-28 9 views
28

Estoy tratando de crear un script de autocompletar genérico usando jQueryUI. El autocompletar debe funcionar 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 la función de fuente utilizando $ (este), pero cuando alerta siempre me 'indefinido'.

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

¿Qué estoy haciendo mal?

+0

¿Cuál es la intención? Para elegir una fuente basada en la identificación del autocompletado seleccionado? – jcolebrand

+2

Quiere hacer un func genérico para autocompletar cualquier ID de campo que se pase. – Hollister

+0

@Hollister, gracias, pero eso no lo aclaró. ¿Te "ayudas" así a menudo? ¿Por qué necesita elegir la fuente en función del elemento al que se adjunta la autocompletar? Parece que necesita crear el bloque de código una vez para cada elemento de autocompletar, o una vez para cada tipo de bloque de código. Esta no es la forma en que SECA, al colocar un bloque if dentro de una estructura de definición de control de origen.Solo hace un código más complejo. – jcolebrand

Respuesta

52

Configure la autocompletar por separado para cada elemento de su selección, utilizando un cierre para mantener una referencia al elemento correspondiente. Algo así como 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 a usar each(): funciona, el código es muy clara y fácil de leer, y no introduce problemas con la eficiencia; pero si está decidido a evitar each(), aquí hay una alternativa ...

* TENGA EN CUENTA que el siguiente enfoque se basa (un poco) en el funcionamiento interno de jQuery Autocomplete, así que recomendaría 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 funcione, al menos hasta que/a menos que cambien la forma en que la función source() se llama desde dentro de la autocomplete plugin.

Entonces, usted tiene dos opciones ... algo para todos.

+0

@drachenstern: ¿te importa elaborar? mi solución * * funcionará. – Lee

+0

Puede funcionar, pero creo que una de cada es mala forma aquí. Mirando la fuente ahora para saber si hay una mejor opción. – jcolebrand

+0

Acabo de probarlo y funciona. Aún no estoy seguro de si esta es la mejor solución. – bart

0

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

+3

que no puede poner $ (this) arriba de la "fuente" porque eso lo pondría en la lista de opciones, no exactamente lo que quiere. – jcolebrand

0

Marwelin es correcto. 'this' hará referencia a la función recién creada en la que está anidado. Esto es fácilmente reparable creando el var id fuera de la función y utilizándolo dentro de la función.

2

para acceder a ese elemento de entrada que debe ser capaz de hacer lo siguiente:

$(this.element).val(); 

Por supuesto, que sólo se pone el valor. Puede acceder a los otros atributos de este modo:

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

Además, suponga que desea tener acceso a ese elemento en el select event, se puede hacer que de este modo:

$(event.target).attr('value'); 
$(event.target).attr('id'); 
Cuestiones relacionadas