2010-01-08 28 views
10

No puedo disparar eventos personales usando Javascript en IE. En Firefox funciona genial.Cómo disparar un evento personal en Javascript

Mi código es:

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); 
} 

Pero cuando intenta ejecutar document.fireEvent('eventoPersonal', evento); en IE, que no funciona. ¿Cómo puedo disparar NO eventos personalizados en IE?

En Internet Explorer me sale el error: "argumentos no válidos" en la línea donde ejecutar document.fireEvent('eventoPersonal', evento);

+0

Genial. ¿A qué te refieres en IE "no funciona"? ¿Le da un error? ¿No pasa nada pero no hay error? – JPot

+0

Gracias, pero no sé por qué me olvido de "NO", porque realmente cuestioné "¿Cómo disparo NO eventos personalizados en Internet Explorer?". –

Respuesta

1

Es posible que desee considerar el uso de una biblioteca para abstraer esto. Ambos prototipos y jquery manejarán esto por ti. Jquery es especialmente bueno al permitirle crear un evento con un código muy simple.

documentación de jQuery está disponible aquí: http://docs.jquery.com/Events

+8

Sí, pero ¿cómo implementan estos frameworks los nombres de eventos personalizados en IE? – Jason

0

Al leer la página correspondiente artículo de MSDN en el método createEventObject, parece como si no se utiliza para la creación de evento personalizado: se usa para crear objetos personalizados que se pueden pasar a eventos ya existentes.

Descripción: Genera un objeto event para pasar información de contexto de evento cuando se utiliza el método fireEvent.

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

actualización: Usted está recibiendo el error "argumentos no válidos" porque 'eventoPersonal' no es un hecho aceptable para disparar.

+1

Gracias, pero no sé por qué me olvido de "NO", porque realmente pregunto "¿Cómo disparo NO eventos personalizados en Internet Explorer?" –

2

Creo que la respuesta es - en IE que lata no eventos de fuego que no están en esta lista:

MSDN - DHTML Events

Por lo que puede recopilar, los marcos almacenan un registro de los nombres de eventos "personalizados" y debe usar su implementación específica activador y manejar funciones para eventos personalizados. Por ejemplo, prototype usa el evento ondatavailable para pasar sus eventos personalizados detrás de escena.

39

Dean Edward describe cómo disparar eventos cutsom en IE

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

Su cerca de la parte inferior del artículo

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 Esto es EXACTAMENTE lo que está preguntando, y aunque técnicamente es una solución, es exactamente lo que el cartel original estaba pidiendo. (¡buen hallazgo!) – cgp

+0

+1 Repito @alt – galambalazs

+0

Excelente respuesta, en realidad estaba buscando un prototipo para ver cómo lo hacían (ver respuesta a continuación) ¡pero este es un excelente ejemplo y artículo! +50 representantes premiados (cuando SO me permite, dice 3 horas ...): D – Jason

1

En IE11 document.dispatchEvent todavía no funciona, pero ahora attachEvent también falta, por lo que la otra solución tampoco funcionará. Sin embargo, se me ocurrió uno incluso más feo.:) Implica reemplazar el método addEventListener y sigue así:

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) {} 
}); 

Espero que esto ayude a alguien.

Cuestiones relacionadas