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é.