2009-04-30 16 views
42

In IE, posso semplicemente chiamare element.click() da JavaScript - come faccio a svolgere lo stesso compito in Firefox? Idealmente mi piacerebbe avere un JavaScript che funzionasse egualmente bene con il cross-browser, ma se necessario avrò JavaScript per-browser diverso per questo.Come faccio a cliccare a livello di programmazione su un elemento in JavaScript?

+1

Questa domanda è stata anche risolta [qui] (http://stackoverflow.com/questions/906486/how-can-i-programmatically-invoke-an-onclick-event-from-a-anchor-tag-while- conservare). –

+1

Si prega di accettare [la mia risposta] (http://stackoverflow.com/a/22469115/865175) come soluzione, come richiesto anche da più utenti. –

risposta

51

Il document.createEvent documentation dice che "Il metodo CreateEvent è deprecato Usa event constructors invece.".

Così si dovrebbe utilizzare questo metodo invece:

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

e fuoco su un elemento come this:

element.dispatchEvent(clickEvent); 

come illustrato here.

+5

l'unico che ha funzionato per me sia in firefox che in chrome – deej

+1

forse dovrebbe essere accettato come risposta dato che quello attuale è da '09 e utilizza le funzioni deprecate –

+1

Soluzione eccellente per Chrome. Il codice per ottenere l'elemento che poi esegue 'dispatchEvent (clickEvent);' per me era: 'var element = document.getElementById (" id-tag ");' – kbpontius

21

Usando jQuery si può fare esattamente la stessa cosa, ad esempio:

$("a").click(); 

Quale sarà "click" tutte le ancore nella pagina.

+17

Proprio come una nota, questo lavoro quando il href utilizza onclick, ad esempio '' Click me

10

element.click() è un metodo standard delineato dal numero W3C DOM specification. Mozilla's Gecko/Firefox follows the standard e consente di chiamare questo metodo solo sugli elementi INPUT.

+5

capito, ma non è utile quando voglio simulare programmazione clic sugli elementi non INPUT. – Bruce

8

Stai cercando di seguire effettivamente il link o attivare l'onclick? È possibile attivare un onclick con qualcosa di simile:

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

interessante, farò un tentativo. Questo fa parte di un'imbracatura di test, quindi non sappiamo in anticipo quale elemento specifico faremo clic su, è ciò che specifica il caso di test. – Bruce

+3

Non è necessario specificare un contesto; poiché onclick è una proprietà di "link", il contesto sarà già impostato in modo appropriato. – James

+2

Questo non ha funzionato in Chrome. Un errore è stato generato nella console dicendo che il metodo "chiamata" non esisteva. – kbpontius

7

Ecco una funzione che lavora cross browser (utilizzabile per altro che gestori di scatto troppo):

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

Ho trovato che avevo bisogno di usare 'el [etype]();' sulla linea 3 per ottenere IE per attivare l'evento nativo (stavo testando con un gestore di clic - vedi http://jsfiddle.net/Pc8qE/) –

+1

A per far funzionare tutto questo dovevo usare un input di tipo submit per firefox e un input di tipo button per IE. –

29

Per Firefox link sembrano essere "speciale". L'unico modo in cui sono riuscito a farlo funzionare era utilizzare createEvent described here on MDN e chiamare la funzione initMouseEvent. Anche che non ha funzionato del tutto, ho dovuto dire manualmente il browser per aprire un link ...

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

come differisce da window.open (element.href, element.target) - al mio Firefox funziona esattamente allo stesso modo e visualizza la brutta barra gialla – iirekm

+1

Se si imposta il terzo ultimo parametro di MouseEvent su true (che significa metaKey (CMD) è stato tenuto premuto quando si è fatto clic), questo non avrebbe aperto la scheda in una scheda di sfondo, giusto? O lo farebbe? – Magne

1

ho usato la funzione di KooiInc elencato sopra, ma ho dovuto usare due diversi tipi di input un 'bottone' per IE e uno "invia" per FireFox. Non sono esattamente sicuro del perché, ma funziona.

// HTML

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

// in 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); 
} 

Ho ricerca e provato molti suggerimenti, ma questo è ciò che ha finito per lavorare. Se avessi avuto più tempo mi sarebbe piaciuto indagare sul perché submit funziona con FF e button con IE, ma quello sarebbe un lusso in questo momento e così via al prossimo problema.

Problemi correlati