191 votes

Comment puis-je forcer programmation un événement onchange sur un input ?

Comment puis-je forcer de manière programmatique un événement onchange sur une entrée ?

J'ai essayé quelque chose comme ceci :

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

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

108voto

Danita Points 1407

En jQuery, j'utilise principalement :

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

2 votes

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

7 votes

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

6 votes

Notez que cela ne déclenche PAS nativement onchange. Il ne fonctionnera que sur tous les auditeurs onchange qui ont été liés via jQuery!

64voto

Kolten Points 1742

Ugh ne pas utiliser eval pour quoi que ce soit. Eh bien, il y a certaines choses, mais elles sont extrêmement rares. Au lieu de cela, vous feriez ceci :

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

Jetez un œil ici pour plus d'options : http://jehiah.cz/archive/firing-javascript-events-properly

3 votes

Évaluer pour objectifier JSON ;)

0 votes

D'accord pour eval - j'ai extrait ce code de stackoverflow.com/questions/33860/… comme exemple de quelque chose que je ne veux pas.

0 votes

Cela ne semble pas fonctionner dans IE7. Exception de "l'objet ne prend pas en charge cette propriété ou méthode" - le voyez-vous aussi?

24voto

Soldarnal Points 2646

Pour une raison quelconque, ele.onchange() me lance une exception "méthode non trouvée" dans IE sur ma page, alors j'ai fini par utiliser cette fonction du lien Kolten fournie et appeler 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);
    }
}

Cependant, j'ai créé une page de test qui a confirmé que l'appel devrait fonctionner avec onchange() :

Édition : La raison pour laquelle ele.onchange() ne fonctionnait pas était parce que je n'avais en fait rien déclaré pour l'événement onchange. Mais fireEvent fonctionne toujours.

2 votes

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

0 votes

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

5 votes

Salut chers Googlers. Nous sommes en 2016! De nos jours, nous écrivons du code comme element.dispatchEvent(new Event('change', true, true)) au lieu de toute cette antiquité et principalement obsolète createEvent et initEvent choses.

2voto

Chris MacDonald Points 3261

Extrait 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 va essentiellement déclencher l'événement DOM réel comme si quelque chose avait vraiment changé.

-4voto

Aaron Powell Points 15598

Si vous utilisez jQuery, vous auriez :

$('#elementId').change(function() { alert('Faire quelque chose'); });

ou MS AJAX :

$addHandler($get('elementId'), 'change', function(){ alert('Faire quelque chose'); });

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

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

$addHandler($get('elementId'), 'change', elementChanged);
function elementChanged(){
  alert('Faire quelque chose !');
}
function editElement(){
  var el = $get('elementId');
  el.value = 'quelque chose de nouveau';
  elementChanged();
}

Puisque vous écrivez déjà une méthode JavaScript qui effectuera le changement, il suffit d'une ligne supplémentaire pour l'appeler.

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

$get('elementId')._events

Cela vous permettrait de faire des travaux de style réflexif pour trouver le(s) bon(s) gestionnaire(s) d'événements à déclencher.

1 votes

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

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