Comment forcer par programme un événement onchange sur une entrée?


123

Comment forcer par programme un événement onchange sur une entrée?

J'ai essayé quelque chose comme ça:

var code = ele.getAttribute('onchange');
eval(code);

Mais mon objectif final est de déclencher toutes les fonctions d'auditeur, et cela ne semble pas fonctionner. La mise à jour de l'attribut 'value' ne suffit pas non plus.

Réponses:


142

Créez un Eventobjet et passez-le à la dispatchEventméthode de l'élément:

var element = document.getElementById('just_an_example');
var event = new Event('change');
element.dispatchEvent(event);

Cela déclenchera des écouteurs d'événements, qu'ils aient été enregistrés en appelant la addEventListenerméthode ou en définissant la onchangepropriété de l'élément.


Si vous voulez que l'événement apparaisse, vous devez passer un deuxième argument au Eventconstructeur:

var event = new Event('change', { bubbles: true });

Informations sur la compatibilité du navigateur:


2
Oui, le MDN Créer et déclencher des événements est une bonne ressource!
Jakub Holý

1
Voici comment le faire correctement, de manière native. Pris en charge dans tous les navigateurs maintenant: caniuse.com/#feat=dispatchevent
Willem Mulder

1
C'est une vraie réponse à cette question. Nous devons y parvenir de manière moderne.
Константин Ван

1
Im essayant de faire l'équivalent sur IE11 mais cela ne fonctionne pas en essayant de changer un champ d'entrée de reactjs. var evt = document.createEvent('CustomEvent'); evt.initCustomEvent('input', true, false, { }); elem.dispatchEvent(evt);
Bodosko

3
Pourquoi tout le monde dit-il que c'est la meilleure réponse? Selon le document Event lié, même la version actuelle d'IE ne le prend toujours pas en charge.
jeff-h

96

Dans jQuery, j'utilise principalement:

$("#element").trigger("change");

2
tihs m'a aidé! Je définissais la valeur d'une case à cocher (cochée ou non) en utilisant le code et l'événement ne se déclenchait pas du tout dans IE, peu importe ce que je faisais. J'ai essayé flou () focus () et quelques autres choses. après avoir défini la valeur, j'ai appelé le déclencheur et j'ai ajouté un événement de clic pour appeler également le déclencheur. Cela provoque plusieurs incendies mais cela ne m'importe pas. Dans IE, j'ajoute des cases à cocher via le code et vous devez cliquer dessus deux fois avant que l'événement de modification ne se déclenche. Merci pour cette astuce.
Dustin Davis

6
En tant que mise à jour, $ ("# element"). Change (); fait la même chose depuis jquery 1.0.
CookieOfFortune

3
Notez que cela ne déclenche PAS une onchange native. Il ne se déclenchera que sur tous les écouteurs onchange liés via jQuery!
Willem Mulder

Une aide ici s'il vous plaît? Aucune de ces solutions ne semble fonctionner pour moi .. stackoverflow.com/questions/51216332/…
Gabe

61

ugh n'utilisez pas eval pour rien . Eh bien, il y a certaines choses, mais elles sont extrêmement rares. Vous feriez plutôt ceci:

document.getElementById("test").onchange()

Regardez ici pour plus d'options: http://jehiah.cz/archive/firing-javascript-events-properly


3
eval for objectifying JSON;)
Aaron Powell

3
json2.js pour objectiver JSON! JSON.parse est déjà disponible sur les navigateurs modernes
jinglesthula

12
Cette technique ne fonctionne que si le gestionnaire de modifications a été attaché en définissant "onchange". Il ne génère pas d'événement «réel» qui déclenche les gestionnaires d'événements w3c ou microsoft. Voir le lien pour plus de détails.
Stephen Nelson

6
Je pense que cette réponse est dépassée maintenant, la réponse de Miscreant utilisant new Event(...)et dispatchEventest la bonne solution de nos jours, semble-t-il.
Jakub Holý

4
Cette réponse est obsolète ; le code ci-dessus ne fonctionnera pas si vous aviez l'habitude Element.addEventListenerde gérer des événements. Pour y parvenir de manière moderne, consultez la réponse de @ Miscreant.
Константин Ван

23

Pour une raison quelconque, ele.onchange () lance une expception "méthode non trouvée" pour moi dans IE sur ma page, alors j'ai fini par utiliser cette fonction à partir du lien fourni par Kolten et en appelant fireEvent (ele, 'change'), qui a fonctionné :

function fireEvent(element,event){
    if (document.createEventObject){
        // dispatch for IE
        var evt = document.createEventObject();
        return element.fireEvent('on'+event,evt)
    }
    else{
        // dispatch for firefox + others
        var evt = document.createEvent("HTMLEvents");
        evt.initEvent(event, true, true ); // event type,bubbling,cancelable
        return !element.dispatchEvent(evt);
    }
}

J'ai cependant créé une page de test qui confirmait que l'appel à onchange () fonctionnait:

<input id="test1" name="test1" value="Hello" onchange="alert(this.value);"/>
<input type="button" onclick="document.getElementById('test1').onchange();" value="Say Hello"/>

Edit: La raison pour laquelle ele.onchange () n'a pas fonctionné était parce que je n'avais rien déclaré pour l'événement onchange. Mais le fireEvent fonctionne toujours.


2
J'aime mieux cette méthode de détection de navigateur (par détection d'objet) que l'exemple que j'ai fourni.
Chris MacDonald

Cela ne fonctionne plus pour Firefox 23: "element.dispatchEvent n'est pas une fonction"
Oliver

4
Salut les collègues Googleurs. C'est 2016! Aujourd'hui , nous écrivons le code comme au element.dispatchEvent(new Event('change', true, true))lieu de tout ce qui Arcane et la plupart du temps dépréciée createEventet des initEventchoses.
ericsoco

3

C'est la réponse la plus correcte pour IE et Chrome:

javascript=>

var element = document.getElementById('xxxx');
var evt = document.createEvent('HTMLEvents');
evt.initEvent('change', false, true);
element.dispatchEvent(evt);

2

Tiré du bas de QUnit

function triggerEvent( elem, type, event ) {
    if ( $.browser.mozilla || $.browser.opera ) {
        event = document.createEvent("MouseEvents");
        event.initMouseEvent(type, true, true, elem.ownerDocument.defaultView,
            0, 0, 0, 0, 0, false, false, false, false, 0, null);
        elem.dispatchEvent( event );
    } else if ( $.browser.msie ) {
        elem.fireEvent("on"+type);
    }
}

Vous pouvez, bien sûr, remplacer les éléments $ .browser par vos propres méthodes de détection de navigateur pour le rendre indépendant de jQuery.

Pour utiliser cette fonction:

var event;
triggerEvent(ele, "change", event);

Cela déclenchera essentiellement l'événement DOM réel comme si quelque chose avait réellement changé.


1

Si vous ajoutez tous vos événements avec cet extrait de code:

//put this somewhere in your JavaScript:
HTMLElement.prototype.addEvent = function(event, callback){
  if(!this.events)this.events = {};
  if(!this.events[event]){
    this.events[event] = [];
    var element = this;
    this['on'+event] = function(e){
      var events = element.events[event];
      for(var i=0;i<events.length;i++){
        events[i](e||event);
      }
    }
  }
  this.events[event].push(callback);
}
//use like this:
element.addEvent('change', function(e){...});

alors vous pouvez simplement utiliser element.on<EVENTNAME>()<EVENTNAME>est le nom de votre événement, et cela appellera tous les événements avec<EVENTNAME>


-2

Pour déclencher tout événement en Javascript.

 document.getElementById("yourid").addEventListener("change", function({
    //your code here
})

2
c'est écouter les événements, pas les déclencher.
invalidusername

-4

si vous utilisez jQuery, vous auriez:

$('#elementId').change(function() { alert('Do Stuff'); });

ou MS AJAX:

$addHandler($get('elementId'), 'change', function(){ alert('Do Stuff'); });

Ou dans le HTML brut de l'élément:

<input type="text" onchange="alert('Do Stuff');" id="myElement" />

Après avoir relu la question, je pense avoir mal lu ce qui devait être fait. Je n'ai jamais trouvé un moyen de mettre à jour un élément DOM d'une manière qui forcera un événement de changement, ce que vous faites mieux est d'avoir une méthode de gestionnaire d'événements distincte, comme ceci:

$addHandler($get('elementId'), 'change', elementChanged);
function elementChanged(){
  alert('Do Stuff!');
}
function editElement(){
  var el = $get('elementId');
  el.value = 'something new';
  elementChanged();
}

Puisque vous écrivez déjà une méthode JavaScript qui fera le changement, il n'y a qu'une ligne supplémentaire à appeler.

Ou, si vous êtes utilisez le framework Microsoft AJAX , vous pouvez accéder à tous les gestionnaires d'événements via:

$get('elementId')._events

Cela vous permettrait d'effectuer des travaux de style réflexion pour trouver le ou les bons gestionnaires d'événements à déclencher.


1
Je crois qu'il veut déclencher l'événement réel, pas exécuter une fonction lorsque l'événement est déclenché ... je pense . lol
Kolten

-5

En utilisant JQuery, vous pouvez effectuer les opérations suivantes:

// for the element which uses ID
$("#id").trigger("change");

// for the element which uses class name
$(".class_name").trigger("change");

undefined n'est pas une fonction.
Hristo Venev
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.