28 votes

Comment créer une classe d'événement personnalisée en Javascript ?

Comment créer une classe d'événement personnalisée similaire à ActionScript ? Par là, j'entends une classe que je peux utiliser pour déclencher mes propres événements et envoyer les données nécessaires.

Je ne veux pas utiliser des bibliothèques tierces comme YUI ou jQuery pour le faire. Mon objectif est de pouvoir envoyer un événement qui ressemble à cela :

document.addEventListener("customEvent", eventHandler, false);

function eventHandler(e){
    alert(e.para1);
}

document.dispatchEvent(new CustomEvent("customEvent", para1, para2));

Veuillez pas de solutions de bibliothèque tierce.

0 votes

Vous pouvez construire le vôtre. C'est très simple, pur JS et ne nécessite pas de DOM - consultez ma réponse ici: stackoverflow.com/questions/31110706/…

26voto

pfleidi Points 1951

Une méthode qui a fonctionné pour moi était d'appeler document.createEvent(), de l'initialiser et de le déclencher avec window.dispatchEvent().

  var event = document.createEvent("Event");
  event.initEvent("customEvent", true, true);
  event.customData = getYourCustomData();
  window.dispatchEvent(event);

2 votes

Est-ce que cela prend en charge tous les navigateurs A, y compris les anciens comme IE6 ?

7 votes

Cela est déprécié selon Mozilla MDN

1 votes

Le lien de @Ajax ne mentionne plus l'obsolescence. Utilisez plutôt ce lien MDN : developer.mozilla.org/en-US/docs/Web/API/document.createEven‌​t

5voto

Rich Hauck Points 41

Je suis un peu en retard pour la fête ici, mais je cherchais la même chose. Je ne suis pas enthousiaste à l'idée de la première réponse (ci-dessus) car elle repose sur le document pour gérer l'événement personnalisé. C'est dangereux car c'est global et pourrait potentiellement entrer en conflit avec un autre script si ce script repose accidentellement sur le même événement personnalisé.

La meilleure solution que j'ai trouvée est ici : Nicholas C. Zakas - Événements personnalisés en Javascript

Malheureusement, comme javascript ne supporte pas les mots-clés d'héritage, c'est un peu désordonné avec le prototypage, mais cela garde certainement les choses bien rangées.

-1voto

nicholas Points 2051

Ceci est de John Resig:

function addEvent( obj, type, fn ) {
  if ( obj.attachEvent ) {
    obj['e'+type+fn] = fn;
    obj[type+fn] = function(){obj['e'+type+fn]( window.event );}
    obj.attachEvent( 'on'+type, obj[type+fn] );
  } else
    obj.addEventListener( type, fn, false );
}
function removeEvent( obj, type, fn ) {
  if ( obj.detachEvent ) {
    obj.detachEvent( 'on'+type, obj[type+fn] );
    obj[type+fn] = null;
  } else
    obj.removeEventListener( type, fn, false );
}

Plus sur son article de blog à http://ejohn.org/projects/flexible-javascript-events/.

1 votes

Bien que le code soit certainement utile, je ne pense pas qu'il aide avec le problème. Vous pouvez attacher et détacher des événements aux éléments, mais la question initiale était comment créer et envoyer (déclencher) un événement personnalisé.

-1voto

WHill Points 56

Je pensais simplement à attribuer un gestionnaire pris en charge à un nouveau espace de noms, c'est-à-dire une référence à un événement pris en charge. Le code ci-dessous fonctionne (collez-le dans la console de Chrome) mais vous pouvez l'écrire dans un format meilleur, et vous devriez avoir des méthodes d'aide supplémentaires (qui peuvent se redéfinir également), pour le support xBrowser, et pour le sniffing des types de support (après avoir détecté quel chemin utiliser, vous devrez faire redéfinir la fonction elle-même. J'espère que ce que j'ai ci-dessous vous aide.

var de = document.documentElement || document.getElementsByTagName[0];

function all(){ console.log('all') };

var customEventForSomeSpecificElement = function customEventForSomeSpecificElement() {
    return ({
            customEvent: function() {
                if ('onclick' in de ) {
                    return 'click';
                }
            },
            init: function(){ return this.customEvent(); }
        }).init();
}();

de.addEventListener(customEventForSomeSpecificElement, all, false);

0 votes

Cela ne déclenche pas d'événements personnalisés.

-3voto

Andris Points 6932

En fait, ce n'est pas si difficile - il n'y a pas tant de définitions d'événements, seulement trois versions. La première est la bonne (addEventListener), ensuite il y a la méthode IE (attachEvent) et enfin la méthode de compatibilité pour les anciens navigateurs (element.onevent = fonction)

Une solution de gestion d'événements complète ressemblerait à ceci :

setEvent = function(element, eventName, handler){
  if('addEventListener' in element){
    //W3
    element.addEventListener(eventName,handler,false);
  }else if('attachEvent' in elm){
    //IE
    elm.attachEvent('on'+eventName,handler)
  }else{
    // compatibilité
    elm['on'+eventName] = handler;
  }
}

et pour effacer les événements :

clearEvent = function(element, eventName, handler){
  if('removeEventListener' in element){
    //W3
    element.removeEventListener(eventName,handler,false);
  }else if('detachEvent' in elm){
    //IE
    elm.detachEvent('on'+eventName,handler)
  }else{
    // compatibilité
    elm['on'+eventName] = null;
  }
}

et un exemple:

setEvent(document, "click", function(){alert('hello world!');});
clearEvent(document, "click", function(){alert('hello world!');});

Ce n'est pas vraiment un exemple complet cependant, car le gestionnaire de compatibilité écrase toujours les événements précédents (il ne les ajoute pas, il les remplace), donc vous voudriez probablement vérifier si un gestionnaire est déjà défini, puis le sauvegarder dans une variable temporaire et l'exécuter à l'intérieur de la fonction gestionnaire d'événements.

0 votes

Cela ne m'aide pas, j'ai besoin d'avoir un événement personnalisé. Ce que cela signifie, c'est qu'il peut y avoir un CustomEvent tout comme il peut y avoir un MouseEvent. Ce que vous faites là est bon mais ce n'est pas la solution que je recherchais. J'ai besoin de pouvoir déclencher un événement et envoyer des données avec celui-ci. Par exemple, dans un jeu, je veux déclencher un événement pour mettre à jour le score, je devrais envoyer le score qui doit être ajouté avec l'événement.

0 votes

Pas la réponse à la question posée

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