Nous sommes en 2012, l'ère post-PC est arrivée, et nous devons encore lutter avec quelque chose d'aussi basique que celui-ci. Cela devrait être très simple .
Jusqu'à ce que ce rêve se réalise, voici la meilleure façon de le faire, cross-browser: utilisez une combinaison des événements inputetonpropertychange , comme ceci:
var area = container.querySelector('textarea');
if (area.addEventListener) {
area.addEventListener('input', function() {
// event handling code for sane browsers
}, false);
} else if (area.attachEvent) {
area.attachEvent('onpropertychange', function() {
// IE-specific event handling code
});
}
L' inputévénement prend en charge IE9 +, FF, Chrome, Opera et Safari , et onpropertychangeprend en charge IE8 (cela fonctionne également avec IE6 et 7, mais il y a quelques bugs).
L'avantage d'utiliser inputet onpropertychangeest qu'ils ne se déclenchent pas inutilement (comme lorsque vous appuyez sur les touches Ctrlou Shift); donc si vous souhaitez exécuter une opération relativement coûteuse lorsque le contenu de la zone de texte change, c'est la voie à suivre .
Maintenant, IE, comme toujours, fait un demi-travail de soutien: ni inputni se onpropertychangedéclenche dans IE lorsque les caractères sont supprimés de la zone de texte. Donc, si vous devez gérer la suppression de caractères dans IE, utilisez keypress(par opposition à l'utilisation de keyup/ keydown, car ils ne se déclenchent qu'une seule fois même si l'utilisateur appuie et maintient une touche enfoncée).
Source: http://www.alistapart.com/articles/expanding-text-areas-made-elegant/
EDIT: Il semble que même la solution ci-dessus ne soit pas parfaite, comme indiqué à juste titre dans les commentaires: la présence de la addEventListenerpropriété sur la zone de texte n'implique pas que vous travaillez avec un navigateur sensé; de même, la présence de la attachEventpropriété n'implique pas IE. Si vous voulez que votre code soit vraiment étanche, vous devriez envisager de le changer. Voir le commentaire de Tim Down pour les pointeurs.