2009-12-03 17 views
46

Quiero simular un clic en cualquier enlace en una página usando JavaScript. Si ese enlace tiene alguna función ligada a su evento 'onclick' (por cualquier otro JS del que yo no tenga ningún control), entonces debe llamarse a esa función, de lo contrario el enlace debería comportarse de la manera normal y abrir una página nueva.Simulando un clic en jQuery/JavaScript en un enlace

No estoy seguro de que basta con comprobar el valor del controlador 'onclick'. Quiero construir esto para que funcione en cualquier elemento de enlace.

No tengo control sobre qué función puede vincularse al evento onclick del enlace utilizando la biblioteca JS (no necesariamente jQuery) o simplemente usando JavaScript.

EDITAR: Con la ayuda de las respuestas a continuación, parece que es posible verificar los controladores de eventos adjuntos utilizando jQuery o utilizando el atributo onclick. ¿Cómo controlo los controladores de eventos adjuntos usando addEventListener/cualquier otra biblioteca JS para que sea infalible?

+1

"¿Cómo puedo comprobar si hay controladores de eventos adjunto utilizando/cualquier otra biblioteca JS addEventListener para que sea a prueba de tontos"? Ahora * ese * es un duplicado;) Ver http://stackoverflow.com/questions/446892/how-to-find-event-listeners-on-a-dom-node/447106#447106 –

+0

Aún no hay resolución, sin embargo:) ¿Tal vez al revés y trates de simular un clic creando un evento MouseEvent? http://stackoverflow.com/questions/1421584/how-can-i-simulate-a-click-to-an-anchor-tag – ankit

+0

@Ankit: sí exactamente, esa segunda respuesta despedirá a los controladores independientemente de cómo estén adjuntos . Aún dices "de lo contrario, el enlace debería comportarse de la manera normal y abrir una página nueva". Vas a tener problemas con eso. Lo siento, no tengo tiempo para ser más útil aquí. –

Respuesta

39

Puede usar la función click para activar el evento click en el elemento seleccionado.

Ejemplo:

$('selector for your link').click(); 

Usted puede aprender sobre diversos selectores de jQuery de documentation.

EDITAR: como han dicho los comentaristas a continuación; esto solo funciona en eventos adjuntos con jQuery, en línea o en el estilo de "elemento.aclick". No funciona con addEventListener, y no seguirá el enlace si no se definen manejadores de eventos. Se podría solucionar esto con algo como esto:

var linkEl = $('link selector'); 
if (linkEl.attr ('onclick') === undefined) { 
    document.location = linkEl.attr ('href'); 
} else { 
    linkEl.click(); 
} 

no sabe acerca de addEventListener sin embargo.

+0

Ver el comentario a la respuesta anterior por Robert – ankit

+1

Eso no es verdad. Funciona en todos los eventos sin importar cómo se haya enlazado. –

+1

El método de clic activa el método onclick de un enlace. No sigue la url definida en el atributo href. – kgiannakakis

8

Fácil! Sólo tiene que utilizar la función de jQuery click:

$("#theElement").click(); 
+1

Por lo que he leído, ¿la función click() de jQuery no activa solo las funciones que se han vinculado al evento click del elemento usando jQuery? No funciona de todos modos. – ankit

+0

@Ankit: también desencadena cualquier controlador de eventos en línea (es decir, 'onclick =" ... "), pero sí, de lo contrario, está en lo cierto. –

+0

@Crescent Gracias, no sabía que – ankit

1

Al principio ver esto question para ver cómo se puede encontrar si un enlace tiene un controlador de jQuery asignado.

siguiente uso:

$("a").attr("onclick") 

para ver si hay un evento de JavaScript asignado.

Si cualquiera de las opciones anteriores es verdadera, llame al método de clic. Si no, obtenga el enlace:

$("a").attr("href") 

y sígalo.

Me temo que no sé qué hacer si addEventListener se usa para agregar un controlador de eventos. Si está a cargo de la fuente de página completa, use solo manejadores de eventos jQuery.

+0

Es cierto, pero los eventos vinculados con "otros JS que no tengo ningún control sobre" (como menciona el OP) como 'addEventListener' o' attachEvent' jQuery no tienen forma de saber acerca de ellos: http://stackoverflow.com/questions/446892/how-to-find-event-listeners-on-a-dom-node/447106 # 447106 –

+0

Habría sido mucho más fácil si estuviera a cargo de la fuente de la página. Lamentablemente, estoy compilando esto como un complemento, por lo que debe ser completamente infalible. – ankit

27

Sólo

$("#your_item").trigger("click"); 

usando .trigger() se puede simular muchos tipos de eventos, que acaba de pasar como parámetro.

+0

Eso ha resuelto mi problema. Gracias. –

0

Todo esto podría no ser útil cuando se usa el botón de forma remota del riel para simular el clic. Intenté portar simulaciones de eventos agradables del prototipo aquí: my snippets. Lo hice y funciona para mí.

7

probar este

function submitRequest(buttonId) { 
    if (document.getElementById(buttonId) == null 
      || document.getElementById(buttonId) == undefined) { 
     return; 
    } 
    if (document.getElementById(buttonId).dispatchEvent) { 
     var e = document.createEvent("MouseEvents"); 
     e.initEvent("click", true, true); 
     document.getElementById(buttonId).dispatchEvent(e); 
    } else { 
     document.getElementById(buttonId).click(); 
    } 
} 

y se puede utilizar como

submitRequest("target-element-id"); 
+2

Esto está funcionando genial. Gracias por publicar la versión no jquery. –

37

Por qué no sólo el buen ol' javascript?

$('#element')[0].click()

+52

¿Cómo es esto bueno ol 'javascript? Esto es jQuery! – SNag

+6

Al acceder al primer elemento en el conjunto jQuery, está obteniendo un elemento DOM, y luego está llamando a un método desde la interfaz HTMLElement, que es, de hecho, el bueno ol 'javascript – frankies

+0

¡Ah! mi error. No le presté atención al '[0]'. Pero, ¿por qué hacer esto? jQuery también admite un método '.click()', por lo que simplemente '$ ('# element'). click()' debería ser suficiente. Si, por otro lado, realmente quieres hacerlo en simple ol 'javascript, 'document.getElementById (' element '). Click()' haría, ¿no? – SNag

Cuestiones relacionadas