2010-05-14 7 views
5

Ho un modulo dove controllare un campo di input per il suo valore e poi faccio una chiamata Ajax usando il plugin typewatch (una piccola cosa che rileva che l'utente ha smesso di digitare dopo un predefinito intervallo). Funziona alla grande.jQuery Ajax: Copia - Paso thingy

Poiché questo campo è uno "sconto coupon" in un modulo d'ordine, il valore potrebbe essere inserito da copia incollando il "codice coupon" da un'e-mail o qualcosa del genere. Funziona anche con Ctrl + C - Ctrl + V per Copia e incolla ma non quando un utente seleziona il testo con il mouse, fa clic su Copia dal menu di scelta rapida e quindi incolla da questo menu.

C'è un modo in jQuery per verificare in qualche modo questo tipo di comportamento in jQuery?

risposta

1

È possibile impostare un timeout basso (1 secondo) per verificare che il valore sia stato modificato dall'ultimo controllo.

Si potrebbe anche semplicemente ignorarlo e quando il modulo invia il contenuto di questo coupon sconto e processarlo.

0

Ho avuto un problema simile prima. Per quanto ne so, il browser non genera eventi quando l'utente incolla tramite clic destro, né quando seleziona dall'elenco di valori usati in precedenza.

Ho finito per risolverlo in un modo abbastanza buono legando inoltre il mio gestore di eventi all'evento di sfocatura. L'unico caso che questo non ha catturato è stato quando si incolla un valore con il mouse, quindi premi Invio per inviarlo. Sono stato in grado di aggirare questo attraverso un po 'di aggiustamenti:

$(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(); 
    } 
    }); 

In sostanza, questo funziona perché jQuery eseguirà gli eventi nell'ordine in cui erano legati. Normalmente, l'invio del modulo avviene sul key-down di un tasto Invio. Per dare al gestore del keyup il tempo di fare la sua magia, è necessario ritardare l'invio del modulo fino a quando non si verifica l'evento keyup, quindi l'altro gestore di chiavi può essere eseguito per primo.

Ora, hai detto che stavi usando un plug-in che aggiunge un ritardo prima di reagire all'evento degli utenti. Ciò significa che potresti non essere in grado di utilizzare questa tecnica alla lettera. Una cosa che potrebbe funzionare, invece, sarebbe chiamare direttamente la funzione del gestore prima di consentire al modulo di inviare. Per fare questo, è necessario modificare l'ultimo gestore 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(); 
    } 
    }); 

Come Josh K accennato prima, si potrebbe semplicemente associare qualcosa alla manifestazione inviare sul modulo per fare qualcosa di simile. Se stai facendo Ajax lì, però, assicurati di impostare async: false nelle opzioni passate, altrimenti il ​​modulo andrà avanti e invierà senza attendere il completamento della chiamata.

0

(questa soluzione non è stato testato, ma!) Mi piacerebbe provare qualcosa di simile:

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 
    } 
}); 

ricordare però le persone sempre in grado di bypassare questo con plugin del browser, quindi non è una garanzia che le cose sono andati come vuoi tu. È necessario SEMPRE eseguire anche alcuni tipi di convalida sul lato server