2010-01-08 6 views
10

Je ne peux pas déclencher des événements personnels en utilisant Javascript dans IE. Dans Firefox fonctionne très bien.Comment déclencher un événement personnel en Javascript

Mon code est:

var evento; 
if(document.createEventObject) 
{ 
    evento = document.createEventObject(); 
    document.fireEvent('eventoPersonal', evento);  
} 
//FF 
else 
{ 
    evento = document.createEvent('Events'); 
    evento.initEvent('eventoPersonal',true,false); 
    document.dispatchEvent(evento); 
} 

Mais lorsque vous essayez d'exécuter document.fireEvent('eventoPersonal', evento); dans IE, il ne fonctionne pas. Comment puis-je déclencher NO événements personnalisés dans IE?

Dans Internet Explorer j'obtiens l'erreur: « Les arguments non valides » dans la ligne où exécuter document.fireEvent('eventoPersonal', evento);

+0

Cool. Que voulez-vous dire dans IE "ne fonctionne pas"? Avez-vous une erreur? Rien ne se passe-t-il, mais aucune erreur? – JPot

+0

Merci, mais je ne sais pas pourquoi j'ai oublié "NON", parce que je prends vraiment la peine "Comment ne pas déclencher des événements personnalisés dans Internet Explorer?". –

Répondre

1

Vous pouvez envisager d'utiliser une bibliothèque pour l'abstraire. Les deux prototypes d'une jquery géreront cela pour vous. Jquery est particulièrement bon pour vous permettre de créer un événement avec un code très simple.

documentation de Jquery est disponible ici: http://docs.jquery.com/Events

+8

Oui, mais comment ces cadres implémentent-ils des noms d'événements personnalisés dans IE? – Jason

0

Comme je l'ai lu la page de l'article MSDN concerné sur la méthode createEventObject, il apparaît comme si elle ne sert pas à créer événement personnalisé - il est utilisé pour créer des objets personnalisés pouvant être transmis à des événements déjà existants.

Description de: Génère un objet event pour transmettre des informations de contexte d'événements lorsque vous utilisez la méthode fireEvent.

http://msdn.microsoft.com/en-us/library/ms536390%28VS.85%29.aspx

Mise à jour: Vous obtenez l'erreur "arguments non valides" parce que 'eventoPersonal' est pas un événement acceptable pour le feu.

+1

Merci, mais je ne sais pas pourquoi j'ai oublié "NON", parce que je prends vraiment "Comment ne pas déclencher des événements personnalisés dans Internet Explorer?" –

2

Je pense que la réponse est - dans IE vous pouvez pas des incendies, qui ne sont pas sur cette liste:

MSDN - DHTML Events

D'après ce que je peut recueillir, les cadres stocker un registre des noms d'événements «personnalisés» et vous devez utiliser leur implémentation spécifique déclencheur et gérer fonctions pour les événements personnalisés. Par exemple, prototype utilise l'événement ondatavailable pour passer en revue leurs événements personnalisés dans les coulisses.

39

Dean Edward décrit comment déclencher des événements de cutsom dans IE

http://dean.edwards.name/weblog/2009/03/callbacks-vs-events/

Son près du bas de l'article

var currentHandler; 

if (document.addEventListener) { 

    // We've seen this code already 

} else if (document.attachEvent) { // MSIE 

    document.documentElement.fakeEvents = 0; // an expando property 

    document.documentElement.attachEvent("onpropertychange", function(event) { 
    if (event.propertyName == "fakeEvents") { 
     // execute the callback 
     currentHandler(); 
    } 
    }); 

    dispatchFakeEvent = function(handler) { 
    // fire the propertychange event 
    document.documentElement.fakeEvents++; 
    }; 
} 
+2

+1 C'est EXACTEMENT ce qu'il demande, et même si techniquement c'est une solution de contournement, c'est exactement ce que l'affiche originale demandait. (bonne trouvaille!) – cgp

+0

+1 Je répète @alt – galambalazs

+0

Grande réponse, je cherchais en fait un prototype pour voir comment ils l'ont fait (voir réponse ci-dessous) mais c'est un bel exemple et article! +50 rep récompensé (quand SO me le permet, dit 3 heures ...): D – Jason

1

Dans IE11 document.dispatchEvent ne fonctionne toujours pas, mais maintenant attachEvent est manquant aussi, donc l'autre solution ne va pas fonctionner non plus. Cependant, j'en ai trouvé un encore plus laid.:) Il implique le remplacement de la méthode addEventListener et continue comme ceci:

var oldEventListener = document.addEventListener; 

document.addEventListener = function (event, func, capture) { 
    if (event == "MyPreciousCustomEvent") { 
     document.MyPreciousCustomEvent = func; 
    } 

    oldEventListener.call(document, event, func, capture); 
}; 

... 

$(function() { 
    try { 
     document.MyPreciousCustomEvent("MyPreciousCustomEvent", {}); 
    } catch (e) {} 
}); 

Espérons que cela aide quelqu'un.

Questions connexes