2012-03-21 17 views
5

JS/jQuery:jQueryUI autocompletar 'seleccionar' no funciona en un clic del ratón, pero funciona en eventos clave

$this.find('input').autocomplete({ 
    source: "/autocomplete_tc_testcasename", 
    minLength: 2, 
    focus: function(e,ui){ 
     $(this).val(ui.item.label); 
     return false; 
    }, 
    select: function(e, ui) { 
     console.log("Selected: "+ui.item.value); 
    }  
}); 

CSS:

 .ui-autocomplete { 
      max-height: 200px; 
      overflow-y: auto; 
      padding: 5px; 
     } 
     .ui-menu { 
      list-style: none; 
      background-color: #FFFFEE; 
      width: 50%; 
      padding: 0px; 
      border-bottom: 1px solid #DDDDDD; 
      border-radius: 6px; 
      -webkit-box-shadow: 0 8px 6px -6px black; 
      -moz-box-shadow: 0 0px 0px -0px black; 
      box-shadow: 0px 2px 2px 0px #999999; 
     } 
     .ui-menu .ui-menu { 
     } 
     .ui-menu .ui-menu-item { 
      color: #990000; 
      font-family:"Verdana"; 
      font-size: 12px; 
      border-top: 3px solid #DDDDDD; 
      background-color: #FFFFFF; 
      padding: 10px; 
     } 

Resumen del problema:

  • AJAX funciona bien, obtengo todas las entradas correctamente en el menú de autocompletar.
  • Puedo usar las flechas de las teclas arriba/abajo para seleccionar las opciones del menú y una vez que presiono regresar, seleccionar evento se dispara correctamente y se muestra el mensaje de la consola.
  • Me puedo enfocar en ui-menu-items con éxito y capturar el mouse sobre eventos para cambiar el valor del texto de entrada.
  • Parece que no puedo hacer clic en el elemento del menú y activar un evento seleccionado. es decir, cuando hago clic en un elemento del menú, el mensaje de la consola nunca se muestra.
  • Es como si el evento click estuviera descartando el menú y cerrándolo en lugar de disparar un evento seleccionado. ¿Alguna idea sobre cómo superar este problema?
  • Probé "appendTo: $ this" en lugar de la div principal de entrada, y luego el clic del mouse funciona bien! - seleccionar evento se dispara y el mensaje de la consola se muestra con éxito. Pero eso no es lo que quiero ya que el menú se agrega dentro del div principal que distorsiona la UI ya que probablemente comparten el mismo índice z. Incluso si cambio el índice Z a un número Higehr en este caso, no fue de mucha ayuda. Así que estoy buscando una solución donde no 'tenga' que usar appendTo si es posible.

Encontré varias otras preguntas en el estadio de béisbol, pero ninguna de estas parece resolver mi pregunta.

jQuery Autocomplete - Left Mouse Click not firing Select event

jQuery UI autocomplete select event not working with mouse click

Gracias!

+1

Esto va a ser muy difícil de recrear y resolver a menos que usted puede crear un ejemplo de su problema en http://jsfiddle.net/o publicar un enlace a un sitio externo .... – ManseUK

+0

Gracias por la sugerencia. En el proceso de detectar el problema, descubrí que se llamaba al evento 'desenfoque' antes de hacer clic con el mouse en el menú de autocompletar. Una vez que cambié la lógica alrededor de esto para manejar ambos eventos en un orden particular, seleccione ahora funciona con un clic del mouse. – rajivRaja

+0

@txciggy: ¿puede describir exactamente cómo "cambió la lógica al respecto para manejar ambos eventos en un orden particular"? Me estoy encontrando con este problema y mi conocimiento del manejo de eventos en JS aún no es lo suficientemente bueno como para que pueda resolverlo yo mismo. gracias –

Respuesta

1

Tengo el mismo problema, pero en mi caso es aún más extraño. el evento select se activa cada dos veces (cuando se usa el mouse). para mí, el evento de selección también se activa muy bien en caso de que use mi teclado.

lamentablemente no pude reproducir este problema a través de jsfiddle. pero aún quiero ofrecer mi jsfiddle, tal vez sea un buen punto de partida para un análisis posterior. aquí está mi código jsFiddle: http://jsfiddle.net/knzNg/

La única diferencia es que utilizo una matriz local como origen de datos para los datos de autocompletar. Supongo que es mejor cambiar el código para usar un origen de datos remoto.

+0

Intenté reproducir este problema con fuentes de datos remotas falsas utilizando fiddler: http://jsfiddle.net/knzNg/2/, desafortunadamente no pude reproducir este problema :-( – Nabi

+0

Tiene otros manejadores de eventos de mouse como blur, hover , dblclick, mouseover, mouseout etc ... En mi caso, tenía un controlador de desenfoque que anularía el evento click en el menú. Una vez que cambié la lógica a su alrededor, todo funciona como esperaba. – rajivRaja

+0

@txciggy Resolví el problema en mi caso. El problema realmente era que algunos códigos javascript que no conocía hicieron algunas manipulaciones dom que causaron que el widget jq ui llamara a la función destruir de autocompletar y volver a crearlo, entonces el problema en mi caso definitivamente parece ser ese otro código js. .. así que en el futuro voy a estar más al tanto de esto. Muchas gracias! – Nabi

0

Creo que puede haber un error en el código del cuadro combinado, ya que tampoco pude hacer que esto funcione. Intente cambiar 'seleccionar:' a 'seleccionado:'.

O podría intentar cambiar el código en el código de IU de JQuery real, creo que a continuación es el culpable, por lo que un cambio en 'seleccionar' podría funcionar. Digo que, como no lo he intentado, simplemente fui con lo anterior.

select: function(event) { 
    this._trigger("selected", event, { item: this.active }); 
} 
+0

Error 'Uncaught TypeError: this._trigger no es una función', ¿qué es una versión? – KingRider

+0

@KingRider Esto es ¡hace 5 años! – BJury

1

he comprobado en todas las versiones de IE (inlcuyendo 9) y siempre terminó con una entrada de control de vacío después de que he seleccionado el un elemento con el ratón. Esto causó algunos dolores de cabeza. Incluso fui al código fuente de jQuery UI para ver qué pasa allí, pero tampoco encontré ninguna pista. Podemos hacer esto estableciendo un tiempo de espera, que internamente pone en cola un evento en el motor javascript de IE. Debido a que se garantiza, que este tiempo de espera del evento se pondrá en cola después de que el evento de foco (esto ya ha sido activado antes por el IE en sí)

select: function (event, ui) { 
    var label = ui.item.label; 
    var value = ui.item.value; 
    $this = $(this); 
    setTimeout(function() { 
     $('#txtBoxRole').val(value); 
    }, 1); 
}, 
0

tengo el mismo problema y después de un montón de google, parece que algún otro plugin jquery está en conflicto con el UI Core. El resultado fue que mi jquery validation plugin version 1.6 estaba causando el error. He cambiado jquery validation to 1.9 y ahora autocomplete se puede seleccionar con el mouse.

0

Cambio de versión de jQuery plugin para la validación 1.9 funciona para mí

+0

Este también fue mi problema. Parece que hay algún conflicto entre versiones anteriores. – SouthShoreAK

0

tuve este problema hoy en día y se encontró que el campo que debe tener autocompletar, tenía un evento de foco, que utiliza document.getElementById ('id'). Value = con una identificación incorrecta, deteniendo así las secuencias de comandos.

7

Me enfrentaba a un problema similar. Quise enviar el formulario cuando el usuario hizo clic en una opción. Pero el formulario se envió incluso antes de que se pudiera establecer el valor de la entrada. Por lo tanto, en el lado del servidor, el controlador obtuvo un valor nulo.

Lo resuelto utilizando una versión modificada de la respuesta de William Niu en otro post relacionado - jQuery UI autocomplete select event not working with mouse click

básicamente he comprobado para el tipo de evento. Si fue un clic, establecí explícitamente el valor del cuadro de entrada al valor en ui.item.value. Vea el fragmento a continuación,

jQuery("#autoDropDown").autocomplete({ 
    source: [ "c++", "java", "php", "coldfusion", "javascript", "asp", "ruby" ], minLength: 0, delay:0, 
    select: function(event, ui) { 
     var origEvent = event; 
     while (origEvent.originalEvent !== undefined){ 
      origEvent = origEvent.originalEvent; 
     } 
     //console.info('Event type = ' + origEvent.type); 
     //console.info('ui.item.value = ' + ui.item.value); 
     if (origEvent.type == 'click'){ 
      document.getElementById('autoDropDown').value = ui.item.value; 
      document.getElementById('myForm').submit(); 
     } else { 
      document.getElementById('myForm').submit();  
     } 

    } 
    }); 
0

El comentario de @ atsurti es bien intencionado, pero hay una manera mejor.

Simplemente use un tiempo de espera en su lugar, lo que le permite a jQuery configurar el formulario. Menos código = mejor código, ¿sí? :)

jQuery("#autoDropDown").autocomplete({ 
    source: [ "c++", "java", "php", "coldfusion", "javascript", "asp", "ruby" ], minLength: 0, delay:0, 
    select: function(event, ui) { 
    window.setTimeout(function(){ 
     document.getElementById('myForm').submit(); 
    }, 1); 
    } 
}); 
0

Si nadie más se enfrenta a este :-) después de algunos años 2 y medio ..

La solución al problema de la OP es llamar event.stopPropagation() dentro de su select de devolución de llamada. Ejemplo:

$input.autocomplete({ 
    // ... options 
    select: function(event, ui) { 
     // ... handlers 
     e.stopPropagation(); 
    } 
}); 

que acaban de volver falsa de la devolución de llamada no funcionó

Cuestiones relacionadas