from array javascript function

array - javascript function parameters



Cómo cambiar el controlador onClick dinámicamente? (11)

Acepto que usar jQuery es la mejor opción. También debe evitar usar la función de carga del cuerpo y usar la función de preparación de jQuery. En cuanto a los oyentes del evento, deberían ser funciones que toman un argumento:

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

o en jQuery:

$(''#foo'').click(function(event) { alert(''foo''); }

Estoy seguro de que hay un millón de publicaciones sobre esto, pero sorprendentemente tengo problemas para encontrar algo.

Tengo un script simple donde quiero configurar el manejador onClick para un enlace <A> en la inicialización de la página.

Cuando ejecuto esto, inmediatamente obtengo un cuadro de alerta ''foo'' donde esperaba recibir una alerta solo cuando hago clic en el enlace.

¿Qué cosa tan estúpida estoy haciendo mal? (He intentado click = y onClick =) ...

<script language="javascript"> function init(){ document.getElementById("foo").click = new function() { alert(''foo''); }; } </script> <body onload="init()"> <a id="foo" href=#>Click to run foo</a> </body>

Editar: Cambié mi respuesta aceptada a una respuesta jQuery. La respuesta de '' Már Örlygsson '' es técnicamente la respuesta correcta a mi pregunta original (el click debe hacerse con un click y el new debe eliminarse), pero desaconsejo encarecidamente que alguien use ''document.getElementById (...) directamente en su código, y use jQuery lugar.


Aquí está la contraparte YUI de las publicaciones de jQuery anteriores.

<script> YAHOO.util.Event.onDOMReady(function() { document.getElementById("foo").onclick = function (){alert(''foo'');}; }); </script>


Creo que quieres usar los métodos .bind y .unBind jQuery. En mis pruebas, al cambiar el evento click con .click y .onclick de hecho llamé al evento recientemente asignado, lo que resultó en un ciclo interminable.

Por ejemplo, si los eventos entre los que está alternando son hide () y unHide (), y al hacer clic uno cambia el evento click al otro, terminaría en un bucle continuo. Una mejor manera sería hacer esto:

$(element).unbind().bind( ''click'' , function(){ alert(''!'') } );


El ejemplo anterior de YUI realmente debería ser:

<script> YAHOO.util.Event.onDOMReady(function() { Dom.get("foo").onclick = function (){alert(''foo'');}; }); </script>


Intenté más o menos todas las otras soluciones el otro día, pero ninguna de ellas funcionó para mí hasta que probé esta:

var submitButton = document.getElementById(''submitButton''); submitButton.setAttribute(''onclick'', ''alert("hello");'');

Por lo que puedo ver, funciona perfectamente.


Nadie abordó el problema real que estaba sucediendo, para explicar por qué se emitió la alerta.

Este código: document.getElementById("foo").click = new function() { alert(''foo''); }; document.getElementById("foo").click = new function() { alert(''foo''); }; asigna la propiedad click del elemento #foo a un objeto vacío. La función anónima aquí está destinada a inicializar el objeto. Me gusta pensar en este tipo de función como un constructor. Pones la alerta allí, por lo que se llama porque la función se llama inmediatamente.

Ver esta pregunta


OMG ... No es solo un problema de "jQuery Library" y "getElementById".

Claro, jQuery nos ayuda a dejar de lado los problemas de navegador cruzado, pero usar la forma tradicional sin bibliotecas aún puede funcionar bien, si realmente entiende que es suficiente en JavaScript.

Tanto @Már Örlygsson como @Darryl Hein te dieron buenas ALTARNATIVAS (yo diría que son solo altarnativos, no guiñol), donde el primero usaba el modo tradicional, y el último jQuery. ¿Pero realmente sabes la respuesta a tu problema? ¿Qué está mal con tu código?

Primero, .click es una forma jQuery. Si desea usar la forma tradicional, use .onclic en su lugar. O le recomiendo que se concentre en aprender a usar jQuery solamente, en caso de confusión. jQuery es una buena herramienta para usar sin conocer DOM lo suficiente.

El segundo problema, también el crítico, la new function(){} es una sintaxis muy mala, o dice que es una sintaxis incorrecta.

No importa si quiere ir con jQuery o sin él, necesita aclararlo.

Hay 3 formas básicas para declarar la función:

function name () {code} ... = function() {code} // known as anonymous function or function literal ... = new Function("code") // Function Object

Tenga en cuenta que javascript distingue entre mayúsculas y minúsculas , por lo que new function() no es una sintaxis estándar de javascript. Los navegadores pueden malinterpretar el significado.

Por lo tanto, su código se puede modificar utilizando la segunda forma como

= function(){alert();}

O usando la tercera forma como

= new Function("alert();");

Al elaborarlo, la segunda forma funciona casi igual que la tercera, y la segunda es muy común, mientras que la tercera es rara. Tus mejores respuestas usan la segunda forma.

Sin embargo, la tercera forma puede hacer algo que el segundo no puede hacer, debido a "tiempo de ejecución" y "tiempo de compilación". Solo espero que sepas que la new Function() puede ser útil a veces. Un día te encuentras con problemas al usar la function(){} , no te olvides de la new Function() .

Para comprender más, se recomienda leer << JavaScript: The Definitive Guide, 6th Edition >>, O''Reilly.


Si desea pasar variables de la función actual, otra forma de hacerlo es, por ejemplo:

document.getElementById("space1").onclick = new Function("lrgWithInfo(''"+myVar+"'')");

Si no necesita pasar información de esta función, es solo:

document.getElementById("space1").onclick = new Function("lrgWithInfo(''13'')");


Tratar:

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


Use .onclick (todo en minúsculas). Al igual que:

document.getElementById("foo").onclick = function () { alert(''foo''); // do your stuff return false; // <-- to suppress the default link behaviour };

En realidad, probablemente se encuentre mucho mejor usando alguna buena biblioteca (recomiendo jQuery por varias razones) para que pueda comenzar a usarlo y escribir JavaScript limpio.

Las compatibilidades entre navegadores (in) son un infierno para cualquier persona, y mucho menos para alguien que acaba de comenzar.


jQuery:

$(''#foo'').click(function() { alert(''foo''); });

O si no desea que siga el enlace href:

$(''#foo'').click(function() { alert(''foo''); return false; });