2010-05-14 8 views
5

J'ai un formulaire où un chèque un champ de saisie pour sa valeur et puis je fais un appel Ajax en utilisant le plugin typewatch (un petit quelque chose qui détecte que l'utilisateur a cessé de taper après un prédéfini intervalle). Cela fonctionne très bien.jQuery Ajax: Copier - Coller thingy

Comme ce champ est une "réduction coupon" dans un formulaire de commande, la valeur peut être saisie en copiant le "code promo" d'un email ou quelque chose. Il fonctionne également avec Ctrl + C - Ctrl + V pour Copier et Coller mais pas quand un utilisateur sélectionne le texte avec la souris, clique sur Copier dans le menu contextuel et ensuite coller à partir de ce menu.

Existe-t-il un moyen pour jQuery de vérifier ce type de comportement dans jQuery?

Répondre

1

Vous pouvez définir un délai d'expiration bas (1 seconde) qui vérifie si la valeur a changé depuis la dernière vérification.

Vous pouvez également simplement l'ignorer et lorsque le formulaire soumet saisir le contenu de cette entrée de réduction coupon et le traiter.

0

J'ai déjà eu un problème similaire. Pour autant que je sache, le navigateur n'émet aucun événement lorsque l'utilisateur colle via un clic droit, ni quand il sélectionne dans la liste des valeurs précédemment utilisées. J'ai fini par le résoudre d'une manière assez bonne en liant en plus mon gestionnaire d'événement à l'événement de flou. Le seul cas que cela n'a pas attrapé était quand ils collez une valeur avec la souris, puis appuyez sur la touche Entrée pour soumettre. J'ai pu contourner ce par une petite carriole:

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

Essentiellement, cela fonctionne parce que jQuery exécutera les événements dans l'ordre où ils ont été liés. Normalement, la soumission de formulaire a lieu sur le clavier d'une touche de saisie. Afin de donner au gestionnaire de clés le temps de faire sa magie, vous devez retarder cette soumission de formulaire jusqu'à ce que l'événement de manipulation se produise, afin que l'autre gestionnaire de clés puisse s'exécuter en premier. Maintenant, vous avez dit que vous utilisiez un plugin qui ajoute un délai avant de réagir à l'événement des utilisateurs. Cela signifie que vous ne pourrez peut-être pas utiliser cette technique verbatim. Une chose qui pourrait fonctionner à la place serait d'appeler la fonction de gestionnaire directement avant de permettre au formulaire de soumettre. Pour ce faire, vous changeriez le dernier gestionnaire de keyup à:

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

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

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

Comme Josh K mentionné précédemment, vous pouvez simplement lier quelque chose à l'événement soumettre votre formulaire pour faire quelque chose de similaire. Si vous faites Ajax là, cependant, assurez-vous de mettre async: false dans les options passées, car sinon le formulaire ira de l'avant et soumettra sans attendre que l'appel soit terminé.

0

(cette solution n'a pas été testé, mais!) Je vais essayer quelque chose comme ceci:

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

Rappelez-vous que les gens peuvent toujours contourner ce avec des plugins de navigateur, il est donc pas une garantie que les choses êtes allé comme vous le voulez. Vous devriez TOUJOURS effectuer une sorte de validation côté serveur aussi