Opera ignoriert den .live () Event-Handler

8

Ich habe die folgende jQuery, die in allen gängigen Browsern funktioniert außer Opera:

%Vor%

Was beim Anklicken des folgenden Links ausgelöst werden soll:

%Vor%

Nur Opera ignoriert dies. Irgendwelche Ideen?

Bearbeiten:

Ich habe gerade entdeckt, dass, wenn ich .live () für .bind () austausche, alles wie erwartet funktioniert. Ich kann jedoch keine Dokumentation zu .live () - Fehlern in Opera finden, und funktioniert in jsFiddle, die auf etwas Umgebungsbezogenes hindeuten würde. Was könnte dieses Verhalten verursachen?

    
m.edmondson 05.07.2011, 15:30
quelle

7 Antworten

7

Das muss geklärt werden. Die obigen Antworten sind richtig, aber niemand hat klar erklärt, woher dein Problem kommt.

Tatsächlich glaube ich, dass Sie das Problem wahrscheinlich auch in anderen Browsern reproduzieren könnten. Das liegt daran, wie .live funktioniert:

Er bindet sich an das Ereignis in document und wartet darauf, dass ein bestimmtes Ereignis dort aufsteigt. Dann prüft es, ob event.target das ist, was Sie handhaben wollten. *

Wenn Sie auf ein Link-Element klicken, ist es durchaus möglich, dass der Browser auf die neue Seite geht bevor das Ereignis hoch genug ist, um Ihren Code auszulösen. In einer App mit vielen HTML- und Event-Handlern sollten alle Browser Probleme haben. Opera startet gerade die Anzeige der neuen Seite und zerstört in diesem Fall die vorherige Seite. Es kommt mehr auf eine bestimmte Situation als auf den Browser an. Zum Beispiel: Sie werden wahrscheinlich nicht sehen, dass dies passiert, wenn Sie eine hohe Netzwerklatenz bei der Verbindung mit der Site hatten.

Um eine Standardaktion für ein a -Element zu verhindern, müssen Sie .bind wie in den alten Tagen;) verwenden, wenn ein Entwickler sich dessen bewusst sein muss, was er mit AJAX lädt und neue Ereignisse an diese in einem Callback bindet.

* Es gibt mehr dazu und .live ist komplizierter. Ich habe gerade beschrieben, was hier gebraucht wird.

    
naugtur 11.07.2011 09:25
quelle
6

Was passiert, wenn Sie den Handler mit folgendem Befehl anfügen:

%Vor%

Sie können auch versuchen, den Handler mit der Methode .click () anzuhängen.

    
quelle
4

Der folgende Code funktioniert wie erwartet in Opera 11.50.

%Vor%

Entweder ist es ein korrigierter Fehler oder etwas Subtileres.

Können Sie überprüfen, ob das oben für Ihre Version von Opera / jQuery funktioniert?

    
Thaddee Tyl 08.07.2011 09:41
quelle
2

Lesen Sie diesen Artikel: Ссылка Versuchen Sie stattdessen Delegate zu verwenden

    
kleinohad 08.07.2011 09:12
quelle
1

Nicht sicher, ob Sie es tun möchten oder ob es für Sie arbeiten wird. Ich hatte ähnliche Probleme mit Opera 9.5 und e.preventDefault() funktioniert nicht, die einzige Lösung, die ich fand, war nur return false ...

%Vor%     
Phill 14.07.2011 08:04
quelle
1

In diesem Fall gibt es zwei Aspekte eines Ereignissprudelns, die in Betracht gezogen werden sollten: Propagierung und Standardaktion.

Propagation bezieht sich auf das Ereignis sprudeln. Zuerst ruft das Anker-Tag das click -Ereignis, dann sein Eltern-Element, dann das Eltern-Eltern-Element und so weiter, bis zum Dokument-Element. Sie können die Weiterleitung eines Ereignisses jederzeit stoppen, indem Sie e.stopPropagation() aufrufen.

Die Standardaktion ist die Aktion des Browsers, wenn nichts unternommen wird, um dies zu verhindern. Der bekannteste Fall ist, wenn ein Anker mit einem href angeklickt wird, versucht der Browser dort zu navigieren. Es gibt jedoch auch andere Beispiele. Wenn Sie beispielsweise ein Bild anklicken und ziehen, erstellen viele Browser ein Geisterbild, das Sie in eine andere Anwendung einfügen können. In beiden Fällen können Sie den Browser jederzeit davon abhalten, die Standardaktion auszuführen, indem Sie e.preventDefault()

aufrufen

Wie bereits in anderen Antworten auf diese Frage erwähnt, setzt jQuerys .live() -Feature einen Handler auf einem Element auf hoher Ebene (wie document ) und ergreift Maßnahmen, nachdem sich die Ereignisse verbreitet haben. Wenn ein Handler zwischen dem Anker und dem Dokument e.stopPropagaiton() ohne aufruft und e.preventDefault() aufruft, würde der Live-Handler nicht mehr reagieren, während der Browser weiterhin navigieren kann (die Standardaktion).

Ich bezweifle, dass dies passiert, da es alle Browser betrifft, aber es ist eine mögliche Erklärung.

    
jimbojw 14.07.2011 20:36
quelle
1

Stellen Sie sicher, dass das document.ready-Ereignis eintritt, bevor Sie auf den Link klicken.

Versuchen Sie, alle Leben oben in das Dokument zu legen.ready Wrapper. Es kann helfen, wenn Sie viel JavaScript-Code haben.

    
Nikolay Fominyh 15.07.2011 06:39
quelle

Tags und Links