2010-05-14 21 views
5

Tengo un formulario donde se comprueba un campo de entrada por su valor y luego hago una llamada Ajax usando el plugin typewatch (un pequeño detalle que detecta que el usuario ha dejado de escribir después de un predefinido intervalo). Funciona muy bien.jQuery Ajax: Copiar - Pegar cosa

Como este campo es un "descuento de cupón" en un formulario de pedido, el valor se puede ingresar copiando y pegando el "código de cupón" de un correo electrónico o algo. También funciona con Ctrl + C - Ctrl + V para copiar y pegar, pero no cuando un usuario selecciona el texto con el mouse, hace clic en copiar desde el menú contextual y luego lo pega desde este menú.

¿Hay alguna manera en jQuery de verificar este tipo de comportamiento en jQuery de alguna manera?

Respuesta

1

Puede establecer un tiempo de espera bajo (1 segundo) que compruebe si el valor ha cambiado desde la última comprobación.

También puede simplemente ignorarlo y cuando el formulario lo envíe, obtenga el contenido de esta entrada de cupón de descuento y trátelo.

0

He tenido un problema similar anteriormente. Hasta donde yo sé, el navegador no emite eventos cuando el usuario pega con un clic derecho, ni cuando seleccionan de la lista de valores usados ​​previamente.

Terminé resolviéndolo de una manera suficientemente buena vinculando además mi controlador de eventos al evento de desenfoque. El único caso que esto no captó fue cuando pegaron un valor con el mouse, luego presionaron la tecla Enter para enviar. Yo era capaz de moverse a través de una pequeña hackery:

$(element) 
    .bind('keydown blur', handlerFunction) 
    .keydown(function(event) { 
    if (event.keyCode === 13 /* Enter Key */) { 
     event.preventDefault(); 
     event.stopPropagation(); 
    } 
    }) 
    .keyup(function(event) { 
    if (event.keyCode === 13 /* Enter Key */) { 
     $(this).closest('form').submit(); 
    } 
    }); 

Esencialmente, esto funciona porque jQuery ejecutará los acontecimientos en el orden en que fueron obligados. Normalmente, la presentación del formulario tiene lugar en el teclado de una tecla Enter. Con el fin de darle tiempo al manejador de keyup para que haga su magia, debe retrasar el envío del formulario hasta que ocurra el evento de keyup, para que el otro manejador de keyup pueda ejecutarse primero.

Ahora, dijo que estaba usando un complemento que agrega un retraso antes de reaccionar ante el evento de los usuarios. Eso significa que quizás no puedas usar esta técnica textualmente. Una cosa que podría funcionar en su lugar sería llamar a la función del controlador directamente antes de permitir que el formulario se envíe. Para hacer eso, tendría que cambiar el último controlador de keyup a:

.keyup(function(event) { // Part 2 
    if (event.keyCode === 13 /* Enter Key */) { 

     handlerFunction.call(this, event); // force it to happen now 

     $(this).closest('form').submit(); 
    } 
    }); 

Como Josh K mencionó antes, simplemente podría obligar a algo que el evento presentará en su forma de hacer algo similar. Sin embargo, si está haciendo Ajax allí, asegúrese de establecer async: false en las opciones aprobadas, ya que de lo contrario el formulario continuará y se enviará sin esperar a que se complete la llamada.

0

(esta solución no ha sido probado, pero!) Me gustaría probar algo como esto:

var keys_pressed = 0; // count the number of key press events 
var required_keys_pressed = 10; 
$('#yourinputElement').keydown (function() { 
    keys_pressed++; // add one 
}); 
$('#yourform').submit (function() { 
    if (keys_pressed < required_keys_pressed) 
    { 
    // not enough keys pressed or was a CTRL + v 
    } 
    else 
    { 
    // required number of keys pressed for your code 
    } 
}); 

recordar, sin embargo la gente siempre puede evitar esto con los plugins del navegador, así que no es una garantía de que las cosas han ido como quieres que lo hagan. Usted debe SIEMPRE realizar algún tipo de validación del lado del servidor también

Cuestiones relacionadas