2010-02-05 10 views
24

Yo estaba jugando con JavaScript en Firefox, y golpeó a un problema que se ilustra en el siguiente ejemplo:Qué es 'clic()' en JavaScript

<HEAD> 
<script type="text/javascript"> 
function click() 
{ 
    alert("click"); 
} 

</script> 
</HEAD> 

<BODY> 

<input type="radio" onclick="click()"> 
</BODY> 

Cuando hago clic en el botón de radio, no pasa nada , y sin errores (en Firebug)

Si cambio el nombre de la función a do_click, y cambio el onclick, entonces recibo la alerta.

Así que la pregunta es: ¿qué está pasando? el clic no parece ser una palabra reservada, o un símbolo existente

Respuesta

35

Código dentro de controladores de eventos en línea tiene como alcance el elemento, como si se tratara de una with bloque.

Por lo tanto, dentro del controlador onclick, el nombre click se resuelve en el método click del elemento.

Esto puede ser demonstrated escribiendo alert(nodeName) en el controlador

+0

Santo s *, yo * nunca * sabía esto. Incluso se comporta igual en IE. Esto parece tan peligroso ahora ... –

+1

Ni yo tampoco, hasta que leí la pregunta. – SLaks

+4

Hay tantas propiedades colgando de un nodo DOM. Si un manejador de clics simplemente intentaba establecer una variable global que pasó a llamarse igual que una de las propiedades de los nodos (por ejemplo, 'innerHTML'), bueno .... * mierda *. –

0

Creo que el clic() es un nombre de procedimiento reservado, por lo que no puede sobreescribirlo. Explica por qué cambiar el nombre y nada más lo hace funcionar.

+0

"no se puede sobrescribir" no es correcto. solo que el objetivo es diferente. – bryantsai

0

Creo que el método click() en javascript simula hacer clic en el botón. Por lo que esta debe ser una especie de bucle infinito ...

Editado para añadir: Salida MSDN para la documentación del método clic

7

elementos DOM tienen un método nativo click().

A continuación se mostrará que clic es un método nativo:

<input type="radio" onclick="alert(click.toString())"> 

se puede inscribir su función de clic como el controlador de eventos de la siguiente manera. Dentro del controlador, this se referirá al elemento HTML.

<input type="radio" id="foo" > 

function click() 
{ 
    alert("click"); 
} 
document.getElementById('foo').onclick = click; 

Hay una excelente serie de artículos sobre los eventos del navegador en http://www.quirksmode.org/js/introevents.html

0

'clic' por sí mismo no es un javascript reserved keyword fuera del contexto del controlador de eventos en línea como respondió Slaks.

Es decir que el método de "clic" definido en la pregunta es válido. Adjuntar el controlador de eventos 'externamente' funcionará. P.ej. utilizando jQuery:

$('input').click(click);