D'après mon expérience, l'événement input type="text"
onchange
se produit généralement après que vous avez quitté (blur
) le contrôle.
Existe-t-il un moyen de forcer le navigateur à déclencher onchange
chaque fois que le contenu de textfield
change? Si non, quel est le moyen le plus élégant de suivre cela «manuellement»?
L'utilisation des événements onkey*
n'est pas fiable, car vous pouvez cliquer avec le bouton droit sur le champ et choisir Coller, ce qui modifiera le champ sans aucune saisie au clavier.
Est-ce que setTimeout
est le seul moyen? .. Moche :-)
Mettre à jour:
Voir Une autre réponse (2015).
_ {Réponse originale: 2009} _
Donc, vous voulez que l’événement onchange
se déclenche lors d’une enfoncement du clavier, du flou, du et coller? C'est magique.
Si vous souhaitez suivre les modifications au fur et à mesure de leur saisie, utilisez "onkeydown"
. Si vous devez intercepter les opérations de collage avec la souris, utilisez "onpaste"
( IE , FF3 ) et "oninput"
( FF, Opera, Chrome, Safari1).
1Cassé pour <textarea>
sur Safari. Utilisez textInput
à la place
Ces jours-ci écoutent oninput
. Cela ressemble à onchange
sans qu'il soit nécessaire de perdre le focus sur l'élément. C'est HTML5.
Il est supporté par tout le monde (même mobile), sauf IE8 et inférieur. Pour IE, ajoutez onpropertychange
. Je l'utilise comme ça:
const $source = document.querySelector('#source');
const $result = document.querySelector('#result');
const typeHandler = function(e) {
$result.innerHTML = e.target.value;
}
$source.addEventListener('input', typeHandler) // register for oninput
$source.addEventListener('propertychange', typeHandler) // for IE8
// $source.addEventListener('change', typeHandler) // fallback for Firefox for <select><option>, for <input> oninput is enough
<input id="source" />
<div id="result"></div>
Javascript est imprévisible et amusant ici.
onchange
se produit uniquement lorsque vous floutez la zone de texteonkeyup
& onkeypress
ne se produit pas toujours lors du changement de texteonkeydown
se produit lors du changement de texte (mais ne peut pas suivre les opérations de copier-coller avec un clic de souris)onpaste
& oncut
se produit en appuyant sur la touche et même avec le clic droit de la souris.Donc, pour suivre le changement dans la zone de texte, nous avons besoin de onkeydown
, oncut
et onpaste
. Dans le rappel de ces événements, si vous vérifiez la valeur de la zone de texte, vous n'obtenez pas la valeur mise à jour car la valeur est modifiée après le rappel. Une solution consiste donc à définir une fonction de délai d’attente avec un délai d’attente de 50 millisecondes (ou peut être inférieure) pour suivre le changement.
C'est un sale coup mais c'est le seul moyen, comme j'ai fait des recherches.
Voici un exemple . http://jsfiddle.net/2BfGC/12/
onkeyup
se produit après avoir tapé, par exemple, j'appuie sur t
lorsque je lève le doigt, l'action se produit mais sur keydown
l'action se produit avant que je ne chiffre le caractère t
J'espère que c'est utile pour quelqu'un.
Donc, onkeyup
est préférable lorsque vous voulez envoyer ce que vous venez de taper maintenant.
J'avais une exigence similaire (champ de style Twitter). Utilisé onkeyup
et onchange
. onchange
prend en charge les opérations de collage de la souris lors de la perte de focus sur le terrain.
[Mise à jour] En HTML5 ou ultérieur, utilisez oninput
pour obtenir les mises à jour en temps réel des modifications de personnage, comme expliqué dans les autres réponses ci-dessus.
Si vous utilisez SEULEMENT Internet Explorer, vous pouvez utiliser ceci:
<input type="text" id="myID" onpropertychange="TextChange(this)" />
<script type="text/javascript">
function TextChange(tBox) {
if(event.propertyName=='value') {
//your code here
}
}
</script>
J'espère que cela pourra aider.
Je pense qu'en 2018, il est préférable d'utiliser l'événement input
.
-
Comme l'indique la spécification WHATWG ( https://html.spec.whatwg.org/multipage/indices.html#event-input-input ):
Déclenché sur les commandes lorsque l'utilisateur modifie la valeur (voir aussi L'événement change )
-
Voici un exemple d'utilisation:
<input type="text" oninput="handleValueChange()">
"input" a fonctionné pour moi.
var searchBar = document.getElementById("searchBar");
searchBar.addEventListener("input", PredictSearch, false);
il existe une solution assez proche (ne corrige pas toutes les méthodes de collage) mais la plupart d'entre elles:
Cela fonctionne aussi bien pour les entrées que pour les textareas:
<input type="text" ... >
<textarea ... >...</textarea>
Fait comme ça:
<input type="text" ... onkeyup="JavaScript: ControlChanges()" onmouseup="JavaScript: ControlChanges()" >
<textarea ... onkeyup="JavaScript: ControlChanges()" onmouseup="JavaScript: ControlChanges()" >...</textarea>
Comme je l'ai dit, toutes les manières de coller un événement sur tous les navigateurs ne sont pas pires. Certains pires ne déclenchent aucun événement du tout, mais les minuteries sont horribles à utiliser pour de tels événements.
Mais la plupart des méthodes de collage sont réalisées avec le clavier et/ou la souris, de sorte qu'un onkeyup ou onmouseup est normalement déclenché après un collage, et onkeyup est également activé lors de la frappe au clavier.
Assurez-vous que votre code de vérification ne prend pas beaucoup de temps ... sinon, l'utilisateur aura une mauvaise impression.
Oui, le truc est de tirer sur la clé et sur la souris ... mais attention, les deux peuvent être licenciés, alors pensez-y!
Veuillez juger de l’approche suivante avec JQuery:
HTML:
<input type="text" id="inputId" />
Javascript (JQuery):
$("#inputId").keyup(function(){
$("#inputId").blur();
$("#inputId").focus();
});
$("#inputId").change(function(){
//do whatever you need to do on actual change of the value of the input field
});
Pour suivre chacun d’entre eux, essayez cet exemple et, avant cela, réduisez complètement le clignotement du curseur à zéro.
<body>
//try onkeydown,onkeyup,onkeypress
<input type="text" onkeypress="myFunction(this.value)">
<span> </span>
<script>
function myFunction(val) {
//alert(val);
var mySpan = document.getElementsByTagName("span")[0].innerHTML;
mySpan += val+"<br>";
document.getElementsByTagName("span")[0].innerHTML = mySpan;
}
</script>
</body>
onblur: l'événement génère à la sortie
onchange: l'événement est généré à la sortie si des modifications sont apportées à inputtext
onkeydown: un événement est généré à chaque pression de touche (pour les clés conservant également des temps longs)
onkeyup: l'événement génère sur n'importe quelle version de clé
onkeypress: idem que onkeydown (ou onkeyup) mais ne réagit pas pour ctrl, backsace, alt other
Vous pouvez également utiliser les événements keydown
, keyup
et keypress
.
2018 ici, c'est ce que je fais:
$(inputs).on('change keydown paste input propertychange click keyup blur',handler);
Si vous pouviez signaler des défauts dans cette approche, je vous en serais reconnaissant.
Robert Siemer addEventListener n'est pas pris en charge dans IE8.
"Les anciennes versions de IE prenaient en charge une méthode équivalente, EventTarget.attachEvent ()." https://developer.mozilla.org/it/docs/Web/API/Element/addEventListener