Ich habe einen Timer in meinem JavaScript, der das Klicken auf einen Link emulieren muss, um nach Ablauf der Zeit zu einer anderen Seite zu gelangen. Dazu benutze ich die click()
Funktion von jQuery . Ich habe $().trigger()
und window.location
auch verwendet, und ich kann es mit allen drei wie beabsichtigt funktionieren lassen.
Ich habe ein seltsames Verhalten beobachtet click()
und versuche zu verstehen, was passiert und warum.
Ich verwende Firefox für alles, was ich in dieser Frage beschreibe, aber ich bin auch daran interessiert, was andere Browser damit machen werden.
Wenn ich keinen Ereignishandler verwendet $('a').bind('click',fn)
oder $('a').click(fn)
festgelegt habe, $('a').click()
scheint der Aufruf überhaupt nichts zu bewirken. Der Standardhandler des Browsers für dieses Ereignis wird nicht aufgerufen, da der Browser die neue Seite nicht lädt.
Wenn ich jedoch zuerst einen Ereignishandler festlege, funktioniert er wie erwartet, auch wenn der Ereignishandler nichts tut.
$('a').click(function(){return true;}).click();
Dadurch wird die neue Seite geladen, als hätte ich selbst auf das a geklickt.
Meine Frage ist also zweifach: Ist das ein seltsames Verhalten, weil ich irgendwo etwas falsch mache? und warum macht das Aufrufen click()
nichts mit dem Standardverhalten, wenn ich keinen eigenen Handler erstellt habe?
BEARBEITEN:
Wie Hoffman feststellte, als er versuchte, meine Ergebnisse zu duplizieren, passiert das oben beschriebene Ergebnis nicht wirklich. Ich bin mir nicht sicher, was die Ereignisse verursacht hat, die ich gestern beobachtet habe, aber ich bin mir heute sicher, dass es nicht das war, was ich in der Frage beschrieben habe.
Die Antwort lautet also, dass Sie keine Klicks im Browser "fälschen" können und dass jQuery lediglich Ihren Event-Handler aufruft. Sie können immer noch verwenden window.location
, um die Seite zu wechseln, und das funktioniert gut für mich.
Antworten:
Interessant ist, dass dies wahrscheinlich eine "Feature-Anfrage" (dh ein Fehler) für jQuery ist. Das jQuery-Klickereignis löst nur dann die Klickaktion (im DOM als onClick-Ereignis bezeichnet) für das Element aus, wenn Sie ein jQuery-Ereignis an das Element binden. Sie sollten zu jQuery-Mailinglisten ( http://forum.jquery.com/ ) gehen und dies melden. Dies könnte das gewünschte Verhalten sein, aber ich denke nicht.
BEARBEITEN:
Ich habe einige Tests durchgeführt und das, was Sie gesagt haben, ist falsch. Selbst wenn Sie eine Funktion an ein 'a'-Tag binden, gelangen Sie trotzdem nicht zu der durch das href-Attribut angegebenen Website. Versuchen Sie den folgenden Code:
Es geht nie zu google.com, es sei denn, Sie klicken direkt auf den Link (mit oder ohne den kommentierten Code). Beachten Sie auch, dass das Klickereignis, selbst wenn Sie es an den Link binden, nach dem Klicken auf die Schaltfläche nicht lila wird. Es wird nur lila, wenn Sie direkt auf den Link klicken.
Ich habe einige Nachforschungen angestellt und es scheint, dass der .click nicht mit 'a'-Tags funktioniert, da der Browser das "falsche Klicken" mit Javascript nicht unterstützt. Ich meine, Sie können kein Element mit Javascript "anklicken". Mit 'a'-Tags können Sie das onClick-Ereignis auslösen, aber der Link ändert seine Farben nicht (in der Farbe des besuchten Links ist die Standardeinstellung in den meisten Browsern lila). Es wäre also nicht sinnvoll, das Ereignis $ (). Click mit 'a'-Tags arbeiten zu lassen, da das Aufrufen des href-Attributs nicht Teil des onClick-Ereignisses ist, sondern im Browser fest codiert ist.
quelle
Eine andere Möglichkeit ist natürlich, nur Vanille-Javascript zu verwenden:
quelle
Wenn Sie sich den Code für die
$.click
Funktion ansehen, gibt es bestimmt eine bedingte Anweisung, die prüft, ob für das Element Listener für dasclick
Ereignis registriert sind , bevor es fortfährt. Warum nicht einfach dashref
Attribut über den Link abrufen und die Seitenposition manuell ändern?BEARBEITEN: Hier ist, warum es nicht durch die
trigger
Funktion jQuery-Quelle für Version 1.3.2 klickt :Nach dem Aufruf von Handlern (falls vorhanden) löst jQuery ein Ereignis für das Objekt aus. Es werden jedoch nur native Handler für Klickereignisse aufgerufen, wenn das Element kein Link ist. Ich denke, das wurde aus irgendeinem Grund absichtlich gemacht. Dies sollte jedoch zutreffen, unabhängig davon, ob ein Ereignishandler definiert ist oder nicht. Daher bin ich mir nicht sicher, warum in Ihrem Fall das Anhängen eines Ereignishandlers dazu führte, dass der native
onClick
Handler aufgerufen wurde. Sie müssen das tun, was ich getan habe, und die Ausführung durchlaufen, um zu sehen, wo sie aufgerufen wird.quelle
Klickhandler für Ankertags sind ein Sonderfall in jQuery.
Ich denke, Sie könnten zwischen dem Onclick-Ereignis des Ankers (dem Browser bekannt) und dem Click-Ereignis des jQuery-Objekts verwechselt werden, das die Vorstellung des DOM vom Anker-Tag umschließt.
Sie können die jQuery 1.3.2-Quelle hier herunterladen .
Die relevanten Abschnitte der Quelle sind die Zeilen 2643-2645 (ich habe dies in mehrere Zeilen aufgeteilt, um das Verständnis zu erleichtern):
quelle
JS / jQuery unterstützt nicht das Standardverhalten von Links, auf die programmgesteuert "geklickt" wurde.
Sie können ein Formular erstellen und abschicken. Auf diese Weise müssen Sie nicht
window.location
oder verwendenwindow.open
, die von Browsern häufig als unerwünschte Popups blockiert werden.Dieses Skript verfügt über zwei verschiedene Methoden: eine, die versucht, drei neue Registerkarten / Fenster zu öffnen (es öffnet nur eine in IE und Chrome, weitere Informationen unten), und eine, die beim Klicken auf einen Link ein benutzerdefiniertes Ereignis auslöst.
Hier ist, wie:
HTML
jQuery (script.js)
Was es tut, ist für jedes Linkelement:
Jetzt wird eine neue Registerkarte / ein neues Fenster geladen
"https://google.nl"
(oder eine beliebige URL, ersetzen Sie sie einfach). Wenn Sie versuchen, mehr als ein Fenster auf diese Weise zu öffnen, erhalten Sie leider einePopup blocked
Meldungsleiste, wenn Sie versuchen, das zweite zu öffnen (das erste ist noch geöffnet).Weitere Informationen darüber, wie ich zu dieser Methode gekommen bin, finden Sie hier:
Neues Fenster / Tab ohne Verwendung von
window.open
oder öffnenwindow.location.href
quelle
Lösen Sie ein Hyperlink-Element aus, das sich innerhalb des Elements befindet, mit dem Sie die jquery verbinden möchten .click ()
In Ihrem Skript verbinden Sie sich mit dem Hauptcontainer, für den das Klickereignis aktiviert werden soll. Anschließend verwenden Sie die Standard-Abfragemethode, um das Element (Typ, Klasse, ID) zu finden und den Klick auszulösen. Was passiert, ist, dass jquery eine rekursive Funktion eingibt, um den Klick auszulösen, und Sie die rekursive Funktion unterbrechen, indem Sie die Funktion 'e' und stopPropagation () verwenden und false zurückgeben, da Sie möchten, dass jquery nichts anderes tut, als den Link auszulösen.
Eine alternative Lösung besteht darin, die Behälter in das Element zu wickeln und sie als Behälter anstelle von zu platzieren. Stellen Sie die Bereiche so ein, dass der Block so angezeigt wird, dass er den w3c-Standards entspricht.
quelle
Mit jQuery können Sie das jQuery-Objekt für dieses Element auswählen. Holen Sie sich dann das zugrunde liegende DOM-Element und rufen Sie seine
click()
Methode auf.von id
Oder verwenden Sie jQuery, um auf eine Reihe von Links nach CSS-Klasse zu klicken
quelle
Es tut nichts, weil keine Ereignisse an das Ereignis gebunden wurden. Wenn ich mich richtig erinnere, verwaltet jQuery eine eigene Liste von Ereignishandlern, die für Leistungszwecke und andere Zwecke an NodeLists gebunden sind.
quelle
Wenn Sie diese Funktion für einen Fall oder sehr wenige Fälle benötigen. (Ihre gesamte App benötigt diese Funktion nicht.) Ich würde jQuery lieber unverändert lassen (aus vielen Gründen, einschließlich der Möglichkeit, auf neuere Versionen, CDN usw. zu aktualisieren) und die folgende Problemumgehung haben:
quelle
Verwenden Sie zum Öffnen des Hyperlinks auf derselben Registerkarte:
quelle