2009-12-03 17 views
46

Ich möchte einen Klick auf einen Link auf einer Seite mit JavaScript simulieren. Wenn dieser Link eine Funktion hat, die an sein "onclick" -Ereignis gebunden ist (durch irgendeinen anderen JS, den ich nicht kontrollieren kann), muss diese Funktion aufgerufen werden, ansonsten sollte sich der Link normal verhalten und eine neue Seite öffnen.Simulieren eines Klicks in jQuery/JavaScript auf einen Link

Ich bin mir nicht sicher, dass nur die Überprüfung des Werts des 'onclick' Handlers ausreichen würde. Ich möchte das so aufbauen, dass es auf jedem Link-Element funktioniert.

Ich habe keine Kontrolle darüber, welche Funktion vielleicht an das onclick-Ereignis des Links gebunden ist, mit welcher JS-Bibliothek (nicht unbedingt jQuery) oder einfach mit JavaScript.

EDIT: Mit Hilfe der Antworten unten sieht es aus wie es möglich ist, nach Ereignishandlern zu suchen, die mit jQuery angefügt werden, oder das onclick Attribut zu verwenden. Wie kann ich nach Event-Handlern suchen, die mit addEventListener/einer anderen JS-Bibliothek angehängt wurden, so dass es narrensicher ist?

+1

„Wie kann ich mich für Event-Handler überprüfe angebracht addEventListener/andere JS-Bibliothek, so dass es narrensicher“? Nun * das * ist ein Duplikat;) Siehe http://stackoverflow.com/questions/446892/how-to-find-event-listeners-on-a-dom-node/447106#447106 –

+0

Immer noch keine Lösung:) Gehen Sie vielleicht anders herum und versuchen Sie, einen Klick zu simulieren, indem Sie ein MouseEvent erstellen? http://stackoverflow.com/questions/1421584/how-cani-i-simulate-a-click-to-an-anchor-tag – ankit

+0

@Ankit: Ja genau, diese zweite Antwort wird Handler feuern, egal wie sie angehängt wurden . Du sagst immer noch "sonst sollte sich der Link normal verhalten und eine neue Seite öffnen". Du wirst damit Probleme haben. Tut mir leid, ich habe keine Zeit, hier hilfreicher zu sein. –

Antwort

39

Sie können die Funktion click verwenden, um das Klickereignis für das ausgewählte Element auszulösen.

Beispiel:

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

Sie können documentation über verschiedene Selektoren in jQuery lernen.

EDIT: wie die Kommentatoren unten gesagt haben; Dies funktioniert nur bei Ereignissen, die mit jQuery, inline oder im Stil von "element.onclick" verknüpft sind. Es funktioniert nicht mit addEventListener und folgt nicht der Verknüpfung, wenn keine Ereignisbehandlungsroutinen definiert sind. Man könnte dies mit so etwas wie dies lösen:

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

nicht über addEventListener obwohl wissen Sie.

+0

Siehe den Kommentar zu der obigen Antwort von Robert – ankit

+1

Das ist nicht wahr. Es funktioniert bei allen Ereignissen, egal wie es gebunden ist. –

+1

Die Click-Methode löst die Onclick-Methode eines Links aus. Es folgt nicht der URL, die im href-Attribut definiert ist. – kgiannakakis

8

Einfach! Verwenden Sie einfach click Funktion jQuery:

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

Aus was ich gelesen habe, löst jQuery's click() - Funktion nur solche Funktionen aus, die mit jQuery auf das click -Ereignis des Elements beschränkt wurden? Es funktioniert sowieso nicht. – ankit

+0

@Ankit: Es löst auch einen Inline-Event-Handler (dh 'onclick =" ... "), aber ja, sonst sind Sie richtig. –

+0

@Crescent Danke, ich wusste das nicht – ankit

1

Zuerst dieses question sehen, um zu sehen, wie Sie feststellen können, ob ein Link ein jQuery-Handler zugeordnet ist.

Nächste Verwendung:

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

, um zu sehen, ob es ein Javascript-Ereignis zugeordnet ist.

Wenn eine der obigen Aussagen zutrifft, rufen Sie die Click-Methode auf. Wenn nicht, rufen Sie den Link:

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

und folgen Sie ihm.

Ich fürchte, ich weiß nicht, was zu tun ist, wenn addEventListener verwendet wird, um einen Event-Handler hinzuzufügen. Wenn Sie für die vollständige Seitenquelle zuständig sind, verwenden Sie nur jQuery-Ereignishandler.

+0

Wahr, aber Ereignisse, die mit "anderen JS verknüpft sind, habe ich keine Kontrolle über" (wie das OP erwähnt) wie "addEventListener" oder "attachEvent" jQuery hat keine Möglichkeit, über diese zu wissen: http://stackoverflow.com/questions/446892/how-to-find-event-listeners-on-a-dom-node/447106 # 447106 –

+0

Es wäre so viel einfacher gewesen, wenn ich für die Seitenquelle zuständig wäre. Leider baue ich das als Plugin und muss daher absolut narrensicher sein. – ankit

27

Gerade

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

mit .trigger() Sie viele Arten von Veranstaltungen simulieren kann, nur um es als Parameter übergeben.

+0

Das ist mein Problem gelöst. Vielen Dank. –

0

All dies kann nicht helfen, sagen Sie, wenn Sie Rails Remote-Formular-Taste verwenden, um Klick zu simulieren. Ich habe versucht, nette Ereignissimulation vom Prototyp hier zu portieren: my snippets. Habe es einfach gemacht und es funktioniert für mich.

7

Versuchen Sie, diese

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

und Sie es wie

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

Das funktioniert gut. Vielen Dank für die Veröffentlichung der Nicht-Jquery-Version. –

37

Warum nicht nur die guten alten Javascript verwenden kann?

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

+52

Wie ist das gute alte Javascript? Das ist jQuery! – SNag

+6

Wenn Sie auf das erste Element im jQuery-Set zugreifen, erhalten Sie ein DOM-Element, und als Nächstes rufen Sie eine Methode über die HTMLElement-Schnittstelle auf, nämlich die gute alte JavaScript-Datei – frankies

+0

Ah! mein Fehler. Ich habe dem '[0]' nicht Beachtung geschenkt. Aber warum? jQuery unterstützt auch eine '.click()' Methode, also einfach '$ ('# element'). click()' sollte ausreichen. Wenn Sie es wirklich wirklich in javascript, document.getElementById ('element') tun möchten, click() 'würde tun, richtig? – SNag

Verwandte Themen