Tout d'abord, quelques informations sur l'ordre de déclenchement des événements pour l'élément input
:
keydown -> keypress -> paste -> input -> keyup -> change
Chaque fois que vous appelez preventDefault
, cela arrête les chaînes, comme si rien ne s'était passé.
Alors ma suggestion est de capturer l'événement de collage, d'empêcher son comportement par défaut et d'y mettre votre logique.
Je sais que je peux utiliser .on('paste', function(event) { ... }), mais cela ne me donne pas le texte qui a été collé ni le contenu de l'élément d'entrée après le collage
En fait, vous pouvez récupérer le contenu du presse-papiers. Voir cette doc. Le support est présent sur tous les navigateurs principaux (mais seulement IE11+). Je ne sais pas si, au moment de la rédaction de la question, cette fonctionnalité était disponible ou non.
Exemple Fiddle
$('#myInput').on('paste', function(e) {
// Annuler l'événement - cela empêche le texte d'être saisi dans l'input et arrête la chaîne d'événements
e.preventDefault();
// Obtenir le contenu du presse-papiers
let paste = (event.clipboardData || window.clipboardData).getData('text');
// Valider ce qui est collé
if (paste == "texte à coller") {
// Si la condition est satisfaite, définir manuellement la valeur de l'input
$(this)
.val(paste)
// Déclencher manuellement les événements si vous le souhaitez
.trigger('input')
.trigger('change');
}
});
Remarques sur le code :
- Cette solution n'inclut pas de
setTimeout
. Chaque fois que vous le faites avec setTimeout
, vous voyez pendant un très court laps de temps le texte copié, comme un effet de clignotement.
- Si le texte répond à la condition, je le définis manuellement dans l'élément
input
. Cependant, cela ne déclenche pas les événements input
et change
. Si vous en avez besoin, déclenchez-les manuellement
- Une approche similaire est de d'abord vérifier le texte et s'il ne répond pas aux exigences, appeler
preventDefault
, sinon ne rien faire. De cette façon, vous évitez de définir manuellement la valeur dans l'input et de déclencher les événements par la suite.