2012-03-13 6 views
16

Esta pregunta fue respondida para el método live(), pero el método live() ha quedado obsoleto a partir de jQuery 1.7 y reemplazado por el método .on() y esta respuesta no funciona para on().¿Cómo se puede vincular la autocompletación de jQuery UI con .on()?

aquí es donde se fue respondida antes: Bind jQuery UI autocomplete using .live()

Alguien sabe cómo hacer la misma cosa con el()?

Si cambia la sintaxis a algo así como

$(document).on("keydown.autocomplete",[selector],function(){...}); 

de

$([selector]).live("keydown.autocomplete",function(){...}); 

En cierto modo se trabaja, sino que interactúa con los eventos internos de autocompletar de una manera extraña. Con live(), si usa el evento select y accede al event.target, le proporciona la identificación del elemento de entrada. Si usa on(), le da el id del menú desplegable "ui-active-menuitem". Algo como esto:

$(".selector").autocomplete({ 
    select: function(event, ui) { 
    console.log(event.target.id); 
} 
}); 

Pero - si se utiliza el evento "abierta", que le dará el id Busco - no sólo en el momento adecuado (lo necesito después de que se ha seleccionado). En este punto, estoy usando una solución de agarrar el ID del elemento de entrada en la función de evento abierto, almacenarlo en un campo oculto, y luego acceder a él en el método de selección donde lo necesito.

+0

¿Se puede publicar un ejemplo de trabajo en [jsFiddle] (http://jsfiddle.net)? He [respondido] (http://stackoverflow.com/a/9531031/520779) una pregunta que, desde mi entendimiento, es similar a su caso, pero no estoy seguro de interpretar su pregunta correctamente (es decir, lo que estás tratando de lograr). – mgibsonbr

+0

Me llevará algún tiempo extraer mi código de la aplicación más grande, pero puedo intentarlo. Para proporcionar más contexto, tengo un formulario con un campo de entrada con autocompletar ejecutándose en él. Necesito usar la función live/on para permitir que se agreguen campos de entrada adicionales dinámicamente haciendo clic en el botón Agregar, con el mismo autocompletado ejecutándose en ellos. – paul

Respuesta

19

Si entendí correctamente, su problema es muy similar al que vi en otro tema. Voy a adapto my answer a su caso, vamos a ver si se soluciona el problema:

$(document).on("focus",[selector],function(e) { 
    if (!$(this).data("autocomplete")) { // If the autocomplete wasn't called yet: 
     $(this).autocomplete({    // call it 
      source:['abc','ade','afg']  //  passing some parameters 
     }); 
    } 
}); 

Ejemplo de trabajo en jsFiddle. Usé focus en lugar de keydown porque necesito volver a activar el evento, y no sé cómo hacerlo con los eventos de la tecla/mouse.

actualización: También podría considerar el uso clone, si sus entradas adicionales tendrán la misma función de autocompletar que una existente:

var count = 0; 
$(cloneButton).click(function() { 
    var newid = "cloned_" + (count++); // Generates a unique id 
    var clone = $(source) // the input with autocomplete your want to clone 
     .clone() 
     .attr("id",newid) // Must give a new id with clone 
     .val("") // Clear the value (optional) 
     .appendTo(target); 
}); 

Véase el updated fiddle. También hay complementos de plantillas de jQuery que pueden hacer que esta solución sea más fácil (aunque todavía no la he usado, así que no puedo hablar por experiencia).

+0

Gracias, esto casi funciona. El autocompletado funciona, pero algunos de los mecanismos internos no funcionan. Como mencioné anteriormente, necesito acceso al evento 'seleccionar'. De los documentos: $ (".selector") .autocomplete ({ select: function (event, ui) {...} }); Con live() el parámetro 'evento' en la función de selección retiene correctamente el elemento de entrada de autocompletar. Intente imprimir/iniciar sesión event.target.id para ver. Al usar on() con esta sintaxis, event.target.id siempre será # ui-active-menuitem, sin importar cuál se utilizó. Pero necesito saber la identificación del campo de entrada en uso. – paul

+0

Además, no creo que necesite la instrucción if (if (! $ (This) .data ("autocompletar")) o el desencadenador y devolver false (trigger ("focus"); return false;). Los eliminé y funciona exactamente igual a lo que puedo decir. – paul

+0

Tienes razón, el re-disparar solo sería necesario si 'autocompletar' necesitaba actuar sobre' enfoque'. Como en mi comentario a tu respuesta a continuación, donde la clave los eventos solo se manejan desde la segunda pulsación de tecla en adelante (ya que el complemento aún no se invoca cuando se produce la primera pulsación de tecla). En cuanto al 'si', intenta evitar (intentar) volver a crear el complemento cada vez que se presiona una tecla (el complemento de buen comportamiento, como autocompletar, no se rompe en eso, pero otros podrían). – mgibsonbr

8

Esto parece ser solo una peculiaridad de la interacción entre .on() y autocompletar. Si quieres hacer esto:

$(function(){ 
    $('.search').live('keyup.autocomplete', function(){ 
    $(this).autocomplete({ 
     source : 'url.php' 
    }); 
    }); 
}); 

Esto funciona con el():

$(function(){ 
    $(document).on("keydown.autocomplete",".search",function(e){ 
    $(this).autocomplete({ 
     source : 'url.php' 
    }); 
    }); 
}); 

Puede acceder a la event.target.id del elemento que la función de autocompletar tocó con el parámetro de la función de devolución de llamada on() (e en el código anterior).

La diferencia es con on(), el evento param en los eventos internos funciona de manera diferente, con diferentes valores. Con live(), el evento.objetivo.id en la función de selección contendrá la ID del elemento de entrada seleccionado. Pero con on(), event.target.id en seleccione contendrá la ID de la lista de elementos de autocompletar (ui-active-menuitem). Con on(), puede acceder al ID del elemento de entrada con event.target.id desde change y open funciones.

+0

No pude reproducir ese comportamiento en [mi ejemplo] (http://jsfiddle.net/mgibsonbr/mcSJC/), ambos alertas 'live' y' on' 'ui-active-menuitem'. Además, dado que el autocompletado está ligado a' keyup' y 'keydown' en lugar de a' focus', solo comienza a funcionar después de presionar la segunda tecla (lo que podría estar bien dependiendo de sus necesidades ...) – mgibsonbr

Cuestiones relacionadas