En 2012, l'ère post-PC est ici, et nous avons encore à se battre avec quelque chose d'aussi simple que cela. Cela devrait être très simple.
Jusqu'à ce que ce rêve est accompli, voici la meilleure façon de le faire, de la croix-navigateur: utilisez une combinaison de l' input
et onpropertychange
événements, comme suit:
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 soin de IE9+, FF, Chrome, Opera et Safari, et onpropertychange
prend soin de IE8 (il est également compatible avec IE6 et 7, mais il y a quelques bugs).
L'avantage de l'utilisation d' input
et onpropertychange
, c'est qu'ils ne mettent pas le feu inutilement (comme lorsque vous appuyez sur l' Ctrl
ou Shift
clés); donc, si vous souhaitez exécuter une opération relativement coûteuse lorsque le textarea de la modification de contenu, c'est le chemin à parcourir.
Maintenant, c'est à dire, comme toujours, n'a qu'une moitié de l'emploi de l'appui de cette: ni input
ni onpropertychange
des incendies dans IE lorsque les caractères sont supprimés à partir du textarea. Donc, si vous avez besoin pour gérer la suppression de caractères dans IE, utilisez keypress
(par opposition à l' keyup
/ keydown
, parce qu'ils ont le feu une seule fois, même si l'utilisateur appuie et est titulaire d'une touche enfoncée).
Source: http://www.alistapart.com/articles/expanding-text-areas-made-elegant/
EDIT: Il semble même que la solution ci-dessus n'est pas parfait, comme l'a justement souligné dans les commentaires: la présence de l' addEventListener
de la propriété sur le textarea ne pas impliquer que vous travaillez avec un sain d'esprit navigateur; de même la présence de l' attachEvent
bien ne pas impliquer IE. Si vous voulez que votre code soit vraiment étanche à l'air, vous devriez envisager de changer cela. Voir Tim en Bas du commentaire pour les pointeurs.