2009-04-30 14 views
42

En IE, puedo simplemente llamar a element.click() desde JavaScript, ¿cómo logro la misma tarea en Firefox? Idealmente, me gustaría tener un JavaScript que funcione igualmente bien entre navegadores, pero si es necesario, tendré un JavaScript diferente para cada navegador.¿Cómo hago clic en un elemento en JavaScript?

+1

Esta pregunta también fue respondida [aquí] (http://stackoverflow.com/questions/906486/how-can-i-programmatically-invoke-an-onclick-event-from-a-anchor-tag-while- mantener). –

+1

Acepte [mi respuesta] (http://stackoverflow.com/a/22469115/865175) como solución, ya que varios usuarios también lo solicitaron. –

Respuesta

51

El document.createEvent documentation dice que "está en desuso El método createEvent Use event constructors lugar.".

lo que debe utilizar este método en lugar:

var clickEvent = new MouseEvent("click", { 
    "view": window, 
    "bubbles": true, 
    "cancelable": false 
}); 

y el fuego en un elemento como esto:

element.dispatchEvent(clickEvent); 

como se muestra here.

+5

el único que funcionó para mí tanto en firefox como en cromo – deej

+1

quizás debería aceptarse como respuesta ya que el actual es del '09 y usa funciones en desuso –

+1

Excelente solución para Chrome. El código para obtener el elemento que luego ejecuta 'dispatchEvent (clickEvent);' para mí fue: 'var element = document.getElementById (" id-tag ");' – kbpontius

21

Usando jQuery se puede hacer exactamente lo mismo, por ejemplo:

$("a").click(); 

Qué hará "clic" todos los anclajes en la página.

+17

Así como una nota, este trabajo cuando el href utiliza onclick, por ejemplo '' Click me

10

element.click() es un método estándar delineado por W3C DOM specification. Gecko/Firefox de Mozilla follows the standard y solo permite llamar a este método en elementos de ENTRADA.

+5

entendido, pero no es útil cuando quiero simular mediante programación clics en elementos no INPUT. – Bruce

8

¿Estás tratando de seguir realmente el enlace o activar el onclick? Puede desencadenar un onclick con algo como esto:

var link = document.getElementById(linkId); 
link.onclick.call(link); 
+1

interesante, voy a intentarlo. Esto es parte de un arnés de prueba, por lo que no sabemos de antemano en qué elemento específico vamos a hacer clic: es lo que especifique el caso de prueba. – Bruce

+3

No necesita especificar un contexto; dado que onclick es una propiedad de 'link', el contexto ya estará configurado apropiadamente. – James

+2

Esto no funcionó en Chrome. Se arrojó un error en la consola diciendo que el método "llamada" no existía. – kbpontius

7

Aquí es una función de trabajo transversal navegador (utilizable para otra cosa que clic manipuladores también):

function eventFire(el, etype){ 
    if (el.fireEvent) { 
     el.fireEvent('on' + etype); 
    } else { 
     var evObj = document.createEvent('Events'); 
     evObj.initEvent(etype, true, false); 
     el.dispatchEvent(evObj); 
    } 
} 
+1

Descubrí que necesitaba usar 'el [etype]();' en la línea 3 para que IE activara el evento nativo (estaba probando con un manejador de clics; consulte http://jsfiddle.net/Pc8qE/) –

+1

Para Para que esto funcione, tuve que usar una entrada de tipo enviar para Firefox y una entrada de tipo botón para IE. –

29

Para los enlaces de Firefox parece ser "especial". La única forma en que pude hacer que funcionara fue usar createEvent described here on MDN y llamar a la función initMouseEvent. Incluso que no funcionó por completo, tenía que contar manualmente el navegador para abrir un enlace ...

var theEvent = document.createEvent("MouseEvent"); 
theEvent.initMouseEvent("click", true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null); 
var element = document.getElementById('link'); 
element.dispatchEvent(theEvent); 

while (element) 
{ 
    if (element.tagName == "A" && element.href != "") 
    { 
     if (element.target == "_blank") { window.open(element.href, element.target); } 
     else { document.location = element.href; } 
     element = null; 
    } 
    else 
    { 
     element = element.parentElement; 
    } 
} 
+2

cómo difiere de window.open (element.href, element.target) - en mi Firefox funciona exactamente igual, y muestra la fea barra amarilla – iirekm

+1

Si configura el tercer último parámetro de MouseEvent en verdadero (lo que significa que metaKey El botón (CMD) se mantuvo pulsado al hacer clic en), esto no abriría la pestaña en una pestaña de fondo, ¿verdad? O lo haría? – Magne

1

utilicé la función de KooiInc mencionados anteriormente, pero tuve que usar dos tipos diferentes de entrada de un 'botón' para IE y un 'enviar' para Firefox. No estoy exactamente seguro de por qué, pero funciona.

// HTML

<input type="button" id="btnEmailHidden" style="display:none" /> 
<input type="submit" id="btnEmailHidden2" style="display:none" /> 

// en JavaScript

var hiddenBtn = document.getElementById("btnEmailHidden"); 

if (hiddenBtn.fireEvent) { 
    hiddenBtn.fireEvent('onclick'); 
    hiddenBtn[eType](); 
} 
else { 
    // dispatch for firefox + others 
    var evObj = document.createEvent('MouseEvent'); 
    evObj.initEvent(eType, true, true); 
    var hiddenBtn2 = document.getElementById("btnEmailHidden2"); 
    hiddenBtn2.dispatchEvent(evObj); 
} 

Tengo buscar y probado muchas sugerencias, pero esto es lo que terminó trabajando. Si tuviera más tiempo, me gustaría investigar por qué enviar trabajos con FF y botón con IE, pero eso sería un lujo en este momento, y así sucesivamente hasta el próximo problema.

Cuestiones relacionadas