2008-10-21 7 views
6

Antes de entrar en los detalles de este problema, me gustaría aclarar la situación. Nuestra empresa de análisis web trabaja como consultora para sitios grandes, y (además de agregar una sola etiqueta SCRIPT) no tenemos control sobre las páginas.¿Manera segura, universal, de usar addEventHandler en Javascript?

Nuestra secuencia de comandos existente instala manejadores usando la forma "antigua" (una versión sofisticada de element.onclick = blah; que también ejecuta el controlador original) que desconoce por completo los manejadores "nuevos" (addEventListener o attachEvent) en la página. Nos gustaría solucionar esto para que nuestro script pueda ejecutarse en más sitios sin requerir tanto desarrollo personalizado.

El primer pensamiento aquí fue tener nuestro propio script use addEventListener/attachEvent, pero esto presenta un problema: del sitio del cliente establece un controlador utilizando la "vieja" manera, se borrará el controlador que instalamos el "nuevo " camino. Las pruebas rápidas y sucias muestran que esto sucede tanto en IE7 como en FF3, aunque no he probado toda la gama de navegadores. También existe el riesgo de que si usamos la "nueva" forma después de que los controladores de eventos de la página ya estén configurados, podamos borrar sus manejadores.

Así que mi pregunta es: ¿qué técnica segura puedo usar para agregar un controlador de eventos en Javascript usando addEventListener/attachEvent que funciona independientemente de cómo se instalen otros controladores de eventos en la página?

Recuerde: no tenemos forma de modificar el sitio en el que está instalado nuestro script. (Tengo que enfatizar que debido a que la respuesta predeterminada a preguntas como esta es siempre, "simplemente reescriba la página para hacer todo de la misma manera").

Respuesta

5

¿Puedes probar tus pruebas rápidas y sucias otra vez? Esto no me pasa en FF3.

elem.onclick = function() { alert("foo"); }; 
elem.addEventListener("click", function() { alert("bar"); }, false); 

Ambos controladores se disparan cuando hago clic en el elemento.

Supongo que olvidó el argumento booleano final en addEventListener (si se usa la fase de captura). También supongo que olvidó que el attachEvent de IE necesita onclick, no click.

+0

Y esto no es un problema en IE o cualquier otro navegador, porque si el comportamiento "adivinado" por la persona que pregunta fue en realidad, esto daría lugar a graves problemas para cualquier código del lado del cliente –

+0

Argh, parece que tiene razón. Disculpas por la pregunta, obviamente el fallo fue un caso de prueba horrible y no hay errores específicos en el navegador.(Al menos IE7 y FF3.) Gracias por apuntarme en la dirección correcta. – blakeyrat

1

addEventListener/attachEvent es seguro en el sentido en que lo pide. Agregan un nuevo manejador de eventos a un nodo sin alterar ningún manejador previamente agregado (incluso una vez asignado a través de una propiedad onxxx). Para una compañía que traiga algo a una página extranjera usando addEventListener/attachEvent debe ser la única práctica. Asignar onxxx handler a través de las propiedades de hecho rompería las páginas de alojamiento scipts (que se han asignado previamente de la misma manera)

+0

Sí, pero el problema aquí es que si la página utiliza element.onclick = ""; después de que hayamos usado addEventListener, borrará a nuestro oyente. Nuestra forma actual de instalar manejadores funciona con element.onclick = "" porque guardamos los contenidos previos del controlador y 'simulamos' cuando los disparamos. – blakeyrat

+0

lea mi texto nuevamente - solo corregido. element.onclick no borrará tus manejadores agregados con addEventListener/attachEvent. Además: "simular" eventos es uno de los peores males, por favor no hagas eso. –

+0

Re: Simulando eventos, debes recordar que este es un producto bastante "antiguo" (en términos de Internet), y simplemente no había otra manera de hacerlo que fuera compatible con IE 5 y 5.5. – blakeyrat

Cuestiones relacionadas