2009-06-10 19 views
13

Tengo una función de JavaScript que establece el evento "onclick" de algunos nodos HTML, incluso si el evento "onclick" se ha configurado anteriormente.¿Cómo puedo verificar si se ha configurado JavaScript-Eventhandler?

¿Cómo puedo verificar si ese evento ya se ha configurado, por lo que puedo extender mi función para establecer el evento solo en nodos HTML donde todavía no se ha establecido?

Respuesta

8

Check, así:

if(typeof someNode.onclick == "function") { 
    // someNode has an event handler already set for the onclick event... 
} 

Por cierto, si está utilizando una biblioteca, debe decirlo - si es así, puede ser que sea más fácil/más limpio y diferiría en base a que la biblioteca están utilizando ...

+0

Y, si desarrollador utiliza algo como: button.addEventListener ('clic', buttonPressed, true); en Mozilla? –

+8

esto no funcionará para manejadores de eventos establecidos usando attachEvent o addEventListener. –

+0

Estoy al tanto de eso, pero dado que el OP no especificó cómo está conectando las cosas, asumí el método DOM 0 de hacerlo. –

1
<input type="button" id="foo" name="foo" value="bar" /> 

<script type="text/javascript"> 
    alert(document.getElementById('foo').onclick); //undefined 
</script> 

Así que lo que quiero hacer es algo como esto:

<script type="text/javascript"> 
    if (undefined == document.getElementById('foo').onclick) 
    { 
     // Add event handler 
    } 
</script> 
+9

esto no funcionará para manejadores de eventos establecidos usando attachEvent o addEventListener. –

+0

thx! no sabía que :) –

5

debería ser posible detectar controladores de eventos unidos mediante <element>.addEventListener() mediante la interceptación de llamadas a la función:

var myListOfAddedEvents = []; 

var realAddEventListener = HTMLElement.prototype.addEventListener; 

HTMLElement.prototype.addEventListener = function(evtType,fn,cap) { 
    myListOfAddedEvents.push(
     {on: this, type: evtType, handler: fn, capture: cap} 
    ); 

    return realAddEventListener.apply(this, arguments); 
}; 

Nota: Esto es código no probado y pueden necesitar algún trabajo. Estoy esperando esta misma función será utilizada por todos los tipos de elementos, pero podría estar equivocado. También solo funcionará si puede ejecutar este bit de código antes de comienzan a agregar eventos. Una copia para attachEvent podría construirse de manera similar.

+0

Es posible que desee combinar esto con la técnica de Jason Bunting. Debido a que hay dos formas de registrar manejadores de eventos, ¡necesitamos usar dos técnicas diferentes para encontrarlos! – joeytwiddle

-2

otra alternativa, la adición de la clase de elemento de

if(!elem.class.match('hasEvent')) 
{ 
    elem.addEventListener(event, function(){}); 
    elem.className = elem.className + ' hasEvent'; 
} 
Cuestiones relacionadas