2009-08-27 12 views
2

Ich arbeite gerade an einem jQuery-Plugin, das das Verhalten einer Besuchermaus verfolgt. Bewegungen, Klicks, Scrollen und Größenanpassung werden aufgezeichnet und über Ajax an einen Ort gesendet, an dem diese Daten analysiert und gespeichert werden.Opera: Erkennen von Ereignissen zurück, weiterleiten, aktualisieren und schließen

Ursprünglich werden die Daten an ein Skript gesendet, wenn der Benutzer die Seite verlässt. Mit "Blättern" beziehe ich mich auf das Auffrischen, das Hin und Her durch die Geschichte, das Schließen des Fensters/Tabs und das Wechseln zu einer anderen Adresse.

Die Lösung funktioniert in allen Browsern außer für Opera. Ich benutze jQuerys 'unload' -Ereignis, das von Opera überhaupt nicht unterstützt wird. Weder vor noch nach dem Laden.

Die Frage ist, wie implementiere ich diese Art von Funktionalität für Opera Browser?

Eine Lösung, die ich hatte, war, eine von mir erstellte "Polling" -Funktion speziell zu nutzen. Mit dieser Funktion können Sie ein Intervall angeben, das den Inhalt alle x Sekunden an den Server sendet. Die Einstellung auf 1 Sekunde speziell für Opera-Browser würde wahrscheinlich dieses Problem lösen, aber es ist eine schreckliche Menge an Aufwand und die Anfragen werden nicht immer in der Reihenfolge abgeschlossen, etc ...

Irgendwelche Vorschläge oder bin ich nur mit dem fest über Option?

Danke!

Ich nehme an, ich könnte Sie einfach mit der Plugin-Quelle verknüpfen. http://www.thedrunkenepic.com/junk/jquery.mousalytics.js

in Bezug auf die oben stehenden Code verknüpft, und fügte hinzu:

if(window.opera) 
{ 
options.interval = 1; 
} 

On line 89 funktioniert super. Meine einzige Sorge ist Overhead, also suche ich immer noch nach einer eleganteren Lösung.

+1

Sie möchten vielleicht überprüfen, was Google Mail funktioniert:

if(typeof(opera) != 'undefined') { opera.setOverrideHistoryNavigationMode('compatible'); history.navigationMode = 'compatible'; } 

Mehr Informationen zu diesem Problem zu finden sind. Es kann Seitenentladevorgänge oder ähnliches auf Opera erkennen. –

+1

Opera löscht Ereignis entladen, wenn Sie auf einen Link klicken, um die Seite zu verlassen, aber grundsätzlich nie anders. – hallvors

+0

http://stackoverflow.com/questions/4683221/cross-browser-onunload-and-onbeforeunload-particular-opera-11 – hallvors

Antwort

2

Nach http://bytes.com/topic/javascript/insights/799229-browser-quirk-onload-onunload-do-not-fire-back-forward-refresh-opera, Oper nie wirklich feuert onload/onunload Ereignisse, so Funktionalität wie das ist nicht möglich, ohne Hacks.

http://dev.opera.com/articles/view/efficient-javascript/?page=4 scheint dies zu bestätigen, und grundsätzlich besagt, dass Oper versucht, den Zustand der Seite über Anforderungen zu erhalten.

Auf weitere investgation zeigt http://unitehowto.com/Onunload dass es möglich sein könnte, mit opera.io.webserver.addEventListener('_close', onunload, false); (wo ist onunload eine zuvor definierte Funktion), aber es zeigt auch, dass diese Funktionalität in allen Versionen von Opera nicht konsistent ist, und möglicherweise nicht an alle.

Ich denke, dass Ihre beste Option wahrscheinlich ist, die Abfrageoption für Opera zu verwenden, oder möglicherweise eine serverseitige Überprüfung für die aktuelle Seite und wo es in die Verlaufs-Warteschlange fällt.

+0

Ja, du hast Recht. Ich denke, ich zwinge nur die Abfrage-Option in Opera Browsern, um Daten alle 5 oder so Sekunden zu schieben. Ich bin mir sicher, dass für so etwas eine maximale Lücke von 5 Sekunden akzeptabel ist. Vielleicht werden sie eines Tages Unterstützung für so etwas geben. Danke, Kumpel! –

+3

opera.io.webserver APIs sind auf (Opera Unite) Widgets und dergleichen beschränkt, daher ist die oben vorgeschlagene Lösung auch keine Antwort für allgemeine Webseiten. – hallvors

1

Funktioniert das Hinzufügen dieser JavaScript-Zeile für Sie?

history.navigationMode = 'compatible'; 

Quelle: http://www.opera.com/support/kb/view/827/

+0

Ah, ja, ich hätte erwähnen sollen, dass ich das auch probiert habe. Kein Würfel. –