2010-11-09 15 views
34

aquí está mi código, ¿hay algún problema con él? no parece a la lista en la pantalla de enfoque, todavía tengo que pulsar una tecla antes de que lista muestraMostrar la lista de autocompletar de jquery ui en el evento de foco

<link media="all" type="text/css" href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.6/themes/smoothness/jquery-ui.css" rel="stylesheet"/> 
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.3/jquery.min.js"></script> 
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.6/jquery-ui.min.js"></script> 

<script type="text/javascript"> 
    $(function() { 
     $('#id').autocomplete({ 
      source: ["ActionScript", 
         "AppleScript", 
         "Asp", 
         "BASIC", 
         "C", 
         "C++", 
         "Clojure", 
         "COBOL", 
         "ColdFusion", 
         "Erlang", 
         "Fortran", 
         "Groovy", 
         "Haskell", 
         "Java", 
         "JavaScript", 
         "Lisp", 
         "Perl", 
         "PHP", 
         "Python", 
         "Ruby", 
         "Scala", 
         "Scheme" 
        ], 
      minLength: 0 
     }); 
    }).focus(function(){    
      $(this).trigger('keydown.autocomplete'); 
    }); 
</script> 


<input type="text" id="id"> 

Respuesta

38

Parece que va a conectar el controlador focus() a la función anónima y no el cuadro de texto.

Prueba esto:

<script type="text/javascript"> 
    $(function() { 
     $('#id').autocomplete({ 
      source: ["ActionScript", 
         /* ... */ 
        ], 
      minLength: 0 
     }).focus(function(){    
      // The following works only once. 
      // $(this).trigger('keydown.autocomplete'); 
      // As suggested by digitalPBK, works multiple times 
      // $(this).data("autocomplete").search($(this).val()); 
      // As noted by Jonny in his answer, with newer versions use uiAutocomplete 
      $(this).data("uiAutocomplete").search($(this).val()); 
     }); 
    }); 
</script> 
+1

thanx..si tienes razón, eso resolvió el problema, y ​​me volví loco por la última 1 hora. – Aman

+2

@Aman: Todos tenemos esos momentos, me alegro de poder ayudar :) – Codesleuth

+1

¿Por qué la rebaja sin comentarios? ¿Para qué era? – Codesleuth

-1

El objetivo genérico de Autocompletar es ejecutar al pulsar la tecla y en base a la carta que escribimos a menudo se llevará a cabo una búsqueda de comodín y mostrar el resultado.

De todos modos, desde el código anterior que puedo ver que:

enfoque (function() {$
(este) .trigger ('keydown.autocomplete');

que se adjunta como dijo por Codesleuth, a la función anónima en lugar del control.

57

la solución para hacer que funcione más de una vez

<script type="text/javascript"> 
    $(function() { 
     $('#id').autocomplete({ 
      source: ["ActionScript", 
         /* ... */ 
        ], 
      minLength: 0 
     }).focus(function(){  
      //Use the below line instead of triggering keydown 
      $(this).data("autocomplete").search($(this).val()); 
     }); 
    }); 
</script> 
+0

usted hizo mi día ... :) – PriteshJ

+9

Prueba con jQuery UI 1.10.0 que necesita para usar '.data (" uiAutocomplete ")' en lugar de '.data (" autocompletar ")' – Rhys

+23

'$ (this) .autocomplete (" búsqueda ")' se sugiere en la [documentación de la API] (http: // api .jqueryui.com/autocomplete/# method-search) – Lekensteyn

11

digitalPBK casi tiene razón ...

Su solución funciona más de una vez pero no cierra la lista desplegable cuando selecciona un elemento de la lista con un clic del mouse. En ese caso, el foco vuelve al control cuando haces clic, por lo que vuelve a abrir la lista cuando debería estar cerrándolo.

Aquí hay una solución, y es la única que funciona para mí de la forma en que creo que debería funcionar cuando se utiliza la última versión (1.8.11) de la función autocompletar(). Cuando el control recibe el foco, no lo hace la pantalla-All-on-foco si la lista desplegable ya se muestra ...

<script type="text/javascript"> 
    $(function() { 
     $('#id').autocomplete({ 
      source: ["ActionScript", 
         /* ... */ 
        ], 
      minLength: 0 
     }).focus(function() { 
      if ($(this).autocomplete("widget").is(":visible")) { 
       return; 
      } 
      $(this).data("autocomplete").search($(this).val()); 
     }); 
</script> 
+1

Gracias! Esta es, en mi propia opinión, la mejor solución al problema. –

+0

¡Excelente respuesta! El evento de enfoque se llamará varias veces y si los datos son enormes, el navegador se congelará. Necesitamos Si la condición – Peru

58

esta llamada directamente método de búsqueda con el valor por defecto cuando el foco.

http://jsfiddle.net/steelywing/ubugC/

$("input").autocomplete({ 
    source: ["Apple", "Boy", "Cat"], 
    minLength: 0, 
}).focus(function() { 
    $(this).autocomplete("search"); 
}); 
+1

este es el único que trabajó para mí – NimChimpsky

+2

Documentación: http://api.jqueryui.com/autocomplete/#method-search – Lekensteyn

+0

mejor respuesta que funciona –

8

$(this).trigger('keydown.autocomplete'); ¿El trabajo no es para mí.

Esto es lo que hice:

$('#id').on("focus", function(event, ui) { 
    $(this).trigger(jQuery.Event("keydown")); 
    // Since I know keydown opens the menu, might as well fire a keydown event to the element 
}); 
+0

Funciona (Y) Awesome – zahid9i

0

Si desea cambiar algo de jQuery UI, hacerlo a la manera de jQuery UI.

Utilizar jQuery UI Widget Factory. Es más fácil de mantener, más rápido y mucho más limpio que asociar eventos al elemento.

$.widget('custom.autocomplete', $.ui.autocomplete, { 
    options: { 
    minLength: 0 
    }, 
    _create: function() { 
    this._on(this.element, { 
     focus: function(event) { 
     this.search(); 
     } 
    }); 

    this._super(); 
    } 
}); 
4

Con versiones más recientes puede que tenga que cambiar de autocompletar a uiAutocomplete

$(this).data("uiAutocomplete").search($(this).val()); 
0

Esta manera correcta de trabajo.

$.widget('custom.autocomplete', $.ui.autocomplete, { 
    options: { 
    minLength: 0 
    }, 
    _create: function() { 
    this._on(this.element, { 
     focus: function(event) { 
     this.search(); 
     } 
    }); 

    this._super(); 
    } 
}); 
Cuestiones relacionadas