Wie simuliere ich einen Klick mit JavaScript?

290

Ich frage mich nur, wie ich mit JavaScript einen Klick auf ein Element simulieren kann.

Derzeit habe ich:

<script type="text/javascript">
function simulateClick(control)
{
    if (document.all)
    {
        control.click();
    }
    else
    {
        var evObj = document.createEvent('MouseEvents');
        evObj.initMouseEvent('click', true, true, window, 1, 12, 345, 7, 220, false, false, true, false, 0, null );
        control.dispatchEvent(evObj);
    }
}
</script>

<a href="http://www.google.com" id="mytest1">test 1</a><br>

<script type="text/javascript">
    simulateClick(document.getElementById('mytest1'));
</script>

Aber es funktioniert nicht :(

Irgendwelche Ideen?

Belgin Fisch
quelle
9
"Fünf häufigste Codierungsfehler": javascript.about.com/od/hintsandtips/a/worst_4.htm - Fast niemand führt mehr IE4 aus und daher ist keine Unterstützung für das document.all DOM mehr erforderlich. Es ist wirklich überraschend, wie viele Leute es noch in ihrer Codierung verwenden. Schlimmer ist, dass die Unterstützung für das Dokument.all DOM häufig getestet wird, um festzustellen, welcher Browser verwendet wird. Wenn dies unterstützt wird, geht der Code davon aus, dass der Browser Internet Explorer ist (was eine völlig falsche Verwendung ist, da Opera auch dieses DOM erkennt). .
Zaf

Antworten:

417

Folgendes habe ich mir ausgedacht. Es ist ziemlich einfach, aber es funktioniert:

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

Verwendungszweck:

eventFire(document.getElementById('mytest1'), 'click');
KooiInc
quelle
12
@ Anderson Green: Ich habe ein Beispiel zu dieser jsfiddle hinzugefügt: jsfiddle.net/KooiInc/W4BHD
KooiInc
4
Beweis, dass dies funktioniert (in Chrom): +1 mit document.querySelector('[value="2706236"]').nextSibling.nextSibling.dispatchEvent(ev);:)
PointedEars
58
Nun, ich habe dein Java-Skript auf dem Abstimmungsknopf ausprobiert :) (funktionierte natürlich)
0fnt
1
Um genau das Benutzerverhalten zu simulieren, sollten Sie die wickeln dispatchEventoder clickAnrufungen mit setTimeout, wie es das scheint dispatchEventist synchron .
Lev Kazakov
16
Event.initEventist jetzt veraltet developer.mozilla.org/en/docs/Web/API/Event/initEvent
artnikpro
391

Was ist mit etwas Einfachem wie:

document.getElementById('elementID').click();

Wird sogar vom IE unterstützt.

Darren Sweeney
quelle
@HermannIngjaldsson Ja, es funktioniert perfekt in IE - msdn.microsoft.com/en-us/library/ie/ms536363%28v=vs.85%29.aspx
Darren Sweeney
6
Die Frage war: "Funktioniert es auch?" - Die Antwort ist ja - AFAIK mindestens bis 8, habe 7 nicht überprüft
Darren Sweeney
24
Gab es das vorher nicht? Warum wurde in den Antworten von 2010 diese einfache Lösung nicht erwähnt? Nur neugierig ...
Parth
3
@ NinoŠkopac Funktioniert derzeit hervorragend für den Desktop, bietet jedoch keine Garantie für die Arbeit mit mobilen Browsern. Selbst auf der Mozilla-Entwicklerseite wird keine mobile Unterstützung angezeigt.
Le0diaz
8
@Parth Vielleicht tat es, es einfach nicht klicken für sie.
Andrew
78

Haben Sie darüber nachgedacht, jQuery zu verwenden, um die Erkennung aller Browser zu vermeiden? Mit jQuery wäre es so einfach wie:

$("#mytest1").click();
BradBrening
quelle
21
Dies feuert nur jQuery-Ereignishandler ab, nicht das Standardverhalten (in diesem Fall geht der Browser zu href)
Romuald Brunet
12
Ich weiß nicht, wie traurig es ist, aber es kann sicher praktisch sein, nicht immer wieder dieselben Browsererkennungsroutinen neu codieren zu müssen.
BradBrening
9
@ErikAigner: Ich habe mich das gleiche gefragt, bin aber froh, dass die akzeptierte Antwort in diesem Fall einfaches JavaScript und nicht jQuery ist. Zu oft auf SO gesehen. Noch einmal: jQuery ist JavaScript, aber JavaScript ist nicht jQuery. Obwohl ich gerne jQuery benutze, sehe ich immer mehr, dass Entwickler die wirklich einfache Sache nicht verstehen. Meine 2 Cent konnten nicht widerstehen zu kommentieren. ;)
Sander
58
Es gibt auch viele Menschen, die nicht wissen würden, wo sie anfangen sollen, wenn sie ihre Kleidung von Hand waschen müssten, da die Mehrheit der Haushalte eine Waschmaschine besitzt und fast ebenso viele einen Wäschetrockner haben. jQuery hat, ähnlich wie moderne Geräte, eine alte Aufgabe viel einfacher und weniger fehleranfällig gemacht. Es ist jedoch nicht für jeden die Lösung, eine Antwort herunterzustimmen, die die Frage mit einer präziseren, verständlicheren Syntax genau beantwortet, während sie browserübergreifend kompatibel ist. +1.
FreeAsInBeer
2
@FreeAsInBeer Dann solltest du auch nirgendwo hingehen, da das Fahren so viel einfacher ist. Aber wir wissen, dass das albern ist. Sie gehen, wenn Sie nicht weit gehen müssen. Sie verwenden einfaches JavaScript, wenn Sie etwas Einfaches tun müssen und nicht eine ganze Bibliothek laden möchten, um dies zu tun. Keine Notwendigkeit, Gas / Bandwitdth für etwas Einfaches zu verschwenden.
Jacob Alvarez
18
var elem = document.getElementById('mytest1');

// Simulate clicking on the specified element.
triggerEvent( elem, 'click' );

/**
 * Trigger the specified event on the specified element.
 * @param  {Object} elem  the target element.
 * @param  {String} event the type of the event (e.g. 'click').
 */
function triggerEvent( elem, event ) {
  var clickEvent = new Event( event ); // Create the event.
  elem.dispatchEvent( clickEvent );    // Dispatch the event.
}

Referenz

mnishiguchi
quelle
Ich glaube, dies sollte heutzutage die beste Antwort sein
DavidTaubmann
15

Mit jQuery können Sie sich viel Platz sparen. Sie müssen nur verwenden:

$('#myElement').trigger("click")
Adam Salma
quelle
10
OP fragte nach JavaScript. Obwohl dies kompakt und funktional ist, bevorzugen einige Leute JS ohne Bibliothek gegenüber Dingen wie jQuery.
Kadaver
43
Platz sparen durch Herunterladen von jquery?
MH
9
Einige Leute bevorzugen auch die Montage.
Dan Nissenbaum
@MH Ich denke, ein gültigeres Argument wäre "es einfach zu halten". Ihr Standardprofil hier in SO hat ungefähr die gleiche Größe wie jQuery.
Adelriosantiago
7

Die beste Antwort ist die beste! Es hat jedoch keine Mausereignisse für mich in Firefox ausgelöst, als etype = 'click'.

Also änderte ich das document.createEventzu , 'MouseEvents'und dass das Problem behoben. Der zusätzliche Code dient zum Testen, ob ein anderes Codebit das Ereignis stört oder nicht, und wenn es abgebrochen wird, würde ich dies in der Konsole protokollieren.

function eventFire(el, etype){
  if (el.fireEvent) {
    el.fireEvent('on' + etype);
  } else {
    var evObj = document.createEvent('MouseEvents');
    evObj.initEvent(etype, true, false);
    var canceled = !el.dispatchEvent(evObj);
    if (canceled) {
      // A handler called preventDefault.
      console.log("automatic click canceled");
    } else {
      // None of the handlers called preventDefault.
    } 
  }
}
brianlmerritt
quelle