web-dev-qa-db-fra.com

événement de changement d'entrée caché

Comment détecter une modification de la valeur d'une entrée masquée? J'ai déjà essayé ces approches sans succès:

$('#id_inpout').live('change',function () {
        var id_el = $(this).attr('id');
        alert(id_el);
    });

et

$('#id_inpout').change(function () {
        var id_el = $(this).attr('id');
        alert(id_el);
    });

et

$('#id_inpout').bind('change',function () {
        var id_el = $(this).attr('id');
        alert(id_el);
    });
22
chokrijobs

Comme cela a été dit en double, et comme vous l'avez vu, les modifications effectuées en javascript ne déclenchent pas l'événement change.

Comme je n'ai pas trouvé de réponses acceptables dans les doublons (c'est-à-dire les réponses n'impliquant pas de changement dans la façon dont la valeur cachée est définie), et en supposant que vous en ayez vraiment besoin (c'est-à-dire que vous ne pouvez pas appeler votre fonction lorsque vous modifiez la valeur d'entrée masquée), voici ce que vous pourriez faire:

function survey(selector, callback) {
   var input = $(selector);
   var oldvalue = input.val();
   setInterval(function(){
      if (input.val()!=oldvalue){
          oldvalue = input.val();
          callback();
      }
   }, 100);
}
survey('#id_inpout', function(){console.log('changed')}); 

Mais j'utiliserais de préférence une solution plus directe (c'est-à-dire appeler une fonction lorsque vous modifiez la valeur d'entrée cachée). Cette fonction peut être un simple répartiteur d'événements (en gros, un objet enveloppant une liste de fonctions à appeler lorsqu'elle est appelée).

EDIT: C'est maintenant 2015 et pour les gens qui se demandent, non, aucune des avancées récentes du monde du Web ne résout ce problème. Les observateurs de mutations n'observent pas la propriété value de l'entrée (ce n'est pas vraiment le DOM) et l'observateur d'objet ES6 est également impuissant pour ces objets natifs.

27
Denys Séguret

Vous pouvez également utiliser trigger('change') après avoir attribué une nouvelle valeur à l'entrée masquée:

$('#hidden_input').val('new_value').trigger('change');
71
Alex