444 votes

Comment détecter que le contenu d'une zone de texte a changé ?

Je veux détecter si le contenu d'une zone de texte a été modifié. Je peux utiliser la méthode keyup, mais elle détectera également les frappes qui ne génèrent pas de lettres, comme les touches fléchées. J'ai pensé à deux méthodes pour y parvenir en utilisant l'événement keyup :

  1. Vérifiez explicitement si le code ascii de la touche pressée est une lettre. \backspace\delete
  2. Utilisez les fermetures pour vous souvenir du texte qui se trouvait dans la zone de texte avant la frappe et vérifiez s'il a changé.

Les deux ont l'air un peu encombrants.

7 votes

Yep, attraper la clé pour ça est mauvais. Vous pouvez coller des trucs sans aucune pression sur les touches.

2 votes

Y a-t-il une chance que vous puissiez poster votre solution finale ? J'ai aussi besoin de résoudre ce problème :)

1 votes

O .keyup() événement... plus d'infos ici : stackoverflow.com/questions/3003879/

745voto

Atul Vani Points 2214

Commencez à observer l'événement "entrée" au lieu du "changement".

jQuery('#some_text_box').on('input', function() {
    // do your stuff
});

...qui est agréable et propre, mais qui pourrait être étendu à d'autres :

jQuery('#some_text_box').on('input propertychange paste', function() {
    // do your stuff
});

12 votes

Le terme "live" est déprécié. Utilisez donc le terme "on". stackoverflow.com/a/15111970/1724777

21 votes

Le seul inconvénient de "input" est qu'il n'est pas compatible avec IE < 9.

5 votes

Input est un événement html5 qui n'est pas pris en charge par tous les navigateurs. developer.mozilla.org/fr/US/docs/Web/API/window.oninput

67voto

Waleed Amjad Points 3952

Utilisez l'événement onchange en HTML/standard JavaScript.

Dans jQuery, c'est le changer() événement. Par exemple :

$('element').change(function() { // do something } );

EDIT

Après avoir lu certains commentaires, qu'en est-il :

$(function() {
    var content = $('#myContent').val();

    $('#myContent').keyup(function() { 
        if ($('#myContent').val() != content) {
            content = $('#myContent').val();
            alert('Content has been changed');
        }
    });
});

3 votes

Oui, cela ressemble à ce que j'ai suggéré dans l'option n° 2 de ma question. Je préfère les fermetures car l'utilisation d'un global fera que cette fonction ne fonctionnera que pour une seule zone de texte. Quoi qu'il en soit, il semble bizarre que Jquery n'ait pas une façon plus simple de faire cela.

1 votes

C'est effectivement bizarre, mais je doute qu'il y ait une meilleure façon de faire. Vous pourriez utiliser setInterval, puis vérifier si le contenu a été modifié toutes les 0,1 secondes, puis faire quelque chose. Cela inclura également les collages de souris et ainsi de suite. Mais cela ne semble pas très élégant.

4 votes

Il est toujours possible que le contenu puisse être modifié sans frappe, par exemple en collant avec la souris. Si vous vous souciez de cela, vous pourriez théoriquement attraper les événements de la souris aussi, mais cette configuration est encore plus laide. D'un autre côté, si vous êtes prêt à ignorer les modifications apportées par la souris, cela fera l'affaire.

48voto

schwarzkopfb Points 297

L'événement "change" ne fonctionne pas correctement, mais l'événement "input" est parfait.

$('#your_textbox').bind('input', function() {
    /* This will be fired every time, when textbox's value changes. */
} );

8 votes

Cela fonctionne parfaitement dans ma situation, bien que l'utilisation de l'option .on est recommandé à partir de la version 1.7 (au lieu de .bind ).

8 votes

L'OP n'a pas spécifié un besoin de compatibilité entre les navigateurs. @schwarzkopfb a fourni une solution. Aucune raison de voter contre parce que vous avez la réputation de le faire.

3 votes

@David il n'a pas non plus précisé quel navigateur

44voto

Catfish Points 3669

Que dites-vous de ça ?

< jQuery 1.7

$("#input").bind("propertychange change keyup paste input", function(){
    // do stuff;
});

> jQuery 1.7

$("#input").on("propertychange change keyup paste input", function(){
    // do stuff;
});

Cela fonctionne dans IE8/IE9, FF, Chrome.

1 votes

Le problème que j'ai avec cette réponse est qu'elle se déclenche une fois que vous avez brouillé la zone de texte, même si la valeur n'a pas changé. Le coupable est "change".

0 votes

Utilisez-vous Chrome ? Il semble que ce soit un bug de Chrome et non de l'événement de changement de jQuery. bugs.jquery.com/ticket/9335

0 votes

Fonctionne mais présente un bug mineur si vous faites un console.log la valeur du champ qu'il enregistre deux fois chaque fois que vous saisissez un caractère.

21voto

bobince Points 270740

Utilisez les fermetures pour vous rappeler quel était le texte de la case à cocher avant la frappe de la touche et vérifiez s'il a changé.

Ouaip. Vous ne devez pas nécessairement utiliser des fermetures, mais vous devrez vous souvenir de l'ancienne valeur et la comparer à la nouvelle.

Cependant ! Cela ne permet pas de détecter toutes les modifications, car il existe des moyens de modifier le contenu d'une zone de texte sans avoir à appuyer sur une touche. Par exemple, en sélectionnant une plage de texte puis en la coupant par un clic droit. Ou le faire glisser. Ou en déposant du texte d'une autre application dans la zone de texte. Ou modifier un mot via le correcteur orthographique du navigateur. Ou encore...

Donc, si vous devez détecter chaque changement, vous devez le faire par sondage. Vous pourriez window.setInterval pour vérifier le champ par rapport à sa valeur précédente toutes les secondes (disons). Vous pourriez également câbler onkeyup à la même fonction afin que les changements que sont causés par les pressions sur les touches sont reflétés plus rapidement.

Encombrant ? Oui. Mais c'est ça ou alors il suffit de le faire à la manière normale du HTML onchange et de ne pas essayer de faire une mise à jour instantanée.

1 votes

De nos jours, le HTML5 input est viable et fonctionne dans les versions actuelles de tous les principaux navigateurs.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X