Llamar a un objeto como una función en javascript

Estoy tratando de ejecutar funciones de javascript que se llaman cuando se realiza un evento (por ejemplo, el evento onClick) en una página web con código javascript. Obtengo la función del evento de esta manera:

var attributval = document.getElementsByTagName("a").getAttribute('onClick');

y estoy tratando de ejecutar este objeto (que, de hecho, es una función de javascript) como una función (supongamos que tenemos en este ejemplo, probé:

var attributval = document.getElementsByTagName("a").getAttribute('onClick');
attributval() = function(){attributval};
attributval();

pero no funcionó.

preguntado el 03 de mayo de 12 a las 17:05

Entonces, ¿simplemente estás haciendo lo que haría un clic? Está intentando ejecutar la función attributval como si se hubiera hecho clic en el botón? -

Sí, también me gustaría hacer eso con otros eventos como onBlur, por ejemplo. -

7 Respuestas

Un atributo DOM no es lo mismo que una propiedad de JavaScript (aunque pueden tener el mismo nombre onclick). Deberías usar

var attributval = document.getElementsByTagName("a")[0].onclick;

recuperar una función (o null) del objeto JS (a diferencia de getAttribute(), que muy probablemente devolverá un toString() para la propiedad).

Ahora, attributval() = es una sintaxis ilegal, ya que attributval() no es un valor l (no puede asignar a eso).

attributval(); funcionará pero sin la segunda línea (que es JavaScript ilegal) invocará el elemento A original onclick manejador (si hay uno definido) o lanzar una excepción (si el onclick el manejador es null).

contestado el 03 de mayo de 12 a las 17:05

Absolutamente lo que estaba buscando funcionó, pero ¿puedo expandir esta solución a otros eventos como onBlur o onScroll en lugar de onClick? Muchas gracias - usuario1319236

Absolutamente, esto funcionará para cualquier atributo on_event_ similar. - Alejandro Pavlov

Omita el intento de crear una función alrededor de la función. Solo llámalo:

var attributval = document.getElementsByTagName("a")[0].onclick;
attributval();

contestado el 03 de mayo de 12 a las 17:05

tratan

var attributval = document.getElementsByTagName("a")[0].getAttribute('onClick');

contestado el 03 de mayo de 12 a las 17:05

Al usar el atributo get, está devolviendo una cadena, por lo que su única forma es usar eval(onclickString) or var fn = new Function(onClickString); fn();

contestado el 03 de mayo de 12 a las 17:05

No estoy seguro de que uno deba abogar por el uso de eval - casi siempre hay una mejor manera. - Andrew Leach

Además de eval y new Function(), si está recopilando una cadena, desafortunadamente, no hay una manera mucho mejor. Pero sí, hay un problema de seguridad aquí. sin embargo, acceder al controlador de eventos onclick también puede generar problemas si otro controlador se le adjunta y al activarlo activaría todos los controladores de eventos que se le adjuntan. Lo que probablemente no sea un problema en su caso, estoy seguro, la mejor manera es no usar el atributo onclick de todos modos :) nunca entendí la necesidad de acceder a los atributos del evento. - gillesc

attributval es simplemente una cadena, ¿correcto? Si confía en este código, ejecútelo con eval(attributval) -- sin embargo cualquier referencia a this no funcionará

Lo que probablemente quieras es activar manualmente un evento. jQuery lo hace fácil.

contestado el 03 de mayo de 12 a las 17:05

Si quiere hacer más que un clic, entonces la respuesta de Chris McDonald en ¿Es posible activar el evento de clic de un enlace (o de cualquier elemento) a través de JavaScript? parece encajar a la perfección, aunque es posible que deba prestar atención al tercer comentario.

contestado el 23 de mayo de 17 a las 12:05

Pensé en agregar una respuesta breve sobre cómo trabajar con eventos usando jQuery, ya que parece relevante.

// Select the link using it's ID field (assuming it has one)
var myLink = $('a#myLink')

// Add a click event to the link
myLink.on('click', function(e) {
    console.log("I've been clicked!");
});

// Trigger the click event manually. This would result in the above
// function being run. Interestingly, this will not cause the browser
// to follow the link like a real click would
myLink.trigger('click');

// Remove the click event (this removes ALL click events)
myLink.off('click');

// Add a click event to the link that only runs once, then removes itself
myLink.one('click', function() {
    alert("I'll only bother you once!");
});

// Add a click event that you can identify from other click events.
// This means that you can trigger it or remove it without bothering other
// click events
myLink.on('click.myClick', function() {
    alert("This click event has been identified as 'myClick'");
});

// Now you can trigger it without triggering other click events
myLink.trigger('click.myClick');

// And remove it, also with no harm coming to other click events
myLink.off('click.myClick');

Espero que esto ayude

contestado el 03 de mayo de 12 a las 17:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.