Wie gefährlich ist e.preventDefault (); und kann es durch Keydown / Mousedown-Tracking ersetzt werden?

7

Ich arbeite an einem Tracking-Skript für ein ziemlich ausgefeiltes CRM für die Verfolgung von Formularaktionen in Google Analytics. Ich versuche, den Wunsch, Formularaktionen genau zu verfolgen, mit dem Bedarf auszugleichen, um zu verhindern, dass ein Formular nicht funktioniert.

Nun, ich weiß, dass etwas nicht funktioniert.

%Vor%

Das DOM entlädt sich bevor es eine Chance hat zu verarbeiten.

Also, eine Menge Beispielcode empfiehlt etwas wie dieses:

%Vor%

Das ist in meisten Fällen zuverlässig, aber es macht mich nervös. Was passiert, wenn etwas zwischen e.preventDefault(); passiert und wenn ich die DOM-basierte Submit-Funktion auslöst? Ich habe die Form total gebrochen.

Ich habe einige andere Analytics-Implementierungen untersucht und dabei etwas Ähnliches bemerkt:

%Vor%

Im Grunde, anstatt die Formularübermittlung zu unterbrechen, wird sie dadurch unterbunden, dass angenommen wird, dass, wenn jemand die Eingabetaste aufruft oder herunterdrückt, dieses Formular übermittelt wird. Offensichtlich führt dies zu einer gewissen Anzahl von Fehlalarmen, aber es eliminiert vollständig die Verwendung von e.preventDefault(); , was meiner Meinung nach das Risiko beseitigt, dass ich jemals verhindern kann, dass ein Formular erfolgreich eingereicht wird.

Also, meine Frage:

  • Ist es möglich, den Standard zu nehmen? Formular-Tracking-Snippet erstellen und verhindern von immer vollständig verhindert das Formular vom Einreichen?
  • Ist das mousedown / keydown Alternative möglich?
  • Gibt es Fälle, in denen die Einreichung fehlschlägt? Spezifisch, gibt es andere Möglichkeiten, um das Einreichen neben der Maus und der Tastatur einzugeben? Und wird der Browser immer Zeit haben, JavaScript zu verarbeiten, bevor er mit dem Entladen der Seite beginnt?
Yahel 29.12.2010, 03:15
quelle

7 Antworten

30

Sie sind bei diesem GooglePlex furchtbar hell und sie haben eines Tages etwas ausprobiert, als ob das passieren würde und jetzt, klar genug. Warum gibst du nicht einen guten Versuch:

%Vor%

Das _gaq.push thigamajigger führt seine Elemente sequentiell aus, also sollten Sie scherzhaft sein.

Und nein, ich weiß nicht, warum ich plötzlich so angefangen habe zu reden.

    
Malvolio 31.12.2010, 04:39
quelle
3

Ich verwende einen anderen Ansatz und erstelle das Ereignis-Tracking-Skript auf der Seite, die aus dem Senden resultiert. Sie könnten es als deferred event tracking bezeichnen.

Ich habe einen Blogpost mit allen Details zu meiner Vorgehensweise bei der Ereignisverfolgung in Backend-Aktionen. Es ist voreingenommen gegenüber Java-Struts, aber Sie können die allgemeine Idee bekommen.

Der Grund ist, dass ich einige Dinge verfolgen möchte, nachdem sie auf der Serverseite passiert sind. In diesem Fall, nachdem das Formular vom Server übermittelt und verarbeitet wurde.

Was ich mache (sehr zusammengefasst):

  • Speichern Sie Ereignisse in einem Objekt, das mit der Sitzung verknüpft ist (eine Liste / Warteschlange)
  • Spülen Sie diese Ereignisse auf der nächsten Seite (generieren Sie das Javascript und leeren Sie die Warteschlange)
Carles Barrobés 01.01.2011 20:16
quelle
3

Wenn Formulare immer funktionieren müssen, aber das Tracking geopfert werden kann, wenn es absolut notwendig ist, können Sie es einfach versuchen / abfangen.

%Vor%     
Adrian Gonzales 04.01.2011 01:06
quelle
1

e.preventDefault() muss nicht direkt am Anfang des Funktionsaufrufs stehen. Warum haben Sie nicht einfach eine if -Anweisung, um zu überprüfen, ob alles korrekt funktioniert, und rufen Sie nur e.preventDefault() auf, wenn dies der Fall ist. Wenn eine Funktion in der Kette nicht das erwartete Ergebnis zurückgibt, setzen Sie eine Variable submitted auf false und verhindern Sie nicht den Standardwert.

Dies ist vielleicht etwas schwieriger zu handhaben, wenn es um etwas asynchrones geht (wie zum Beispiel setTimeout , aber es wird Möglichkeiten geben, ziemlich sicher zu machen, je nachdem wie der Code aussieht. So können Sie nach Methoden suchen Existieren mit if (_gaq.push) (zum Beispiel). Sie können nicht 100% sicher sein, ohne jede einzelne Kombination in jedem Browser zu testen, aber ich denke, dass Sie damit ein ziemlich zufriedenstellendes Ergebnis erzielen können.

    
Nathan MacInnes 03.01.2011 15:49
quelle
0

Ein anderer Ansatz:

%Vor%

Ich würde auf diese Weise erraten, dass _trackEvent synchron wäre, aber ich habe es nicht getestet.

    
Thomas 29.12.2010 03:57
quelle
0

Gibt es einen Grund, warum Sie den Aufruf von Google Analytics nicht einfach serverseitig basierend auf dem empfangenen POST ausgeben können?

Ich weiß nicht, wie Ihr System aufgebaut ist, aber dieses PHP-Projekt würde beispielsweise einen Aufruf an GA ausgeben, wodurch das Problem des DOM-Entladens, der Notwendigkeit, das Formular zu brechen, usw. beseitigt wird / p>

Ссылка

Ich nehme zur Kenntnis, dass Sie möglicherweise einen Cookie erfassen müssen - Sie könnten den Wert in ein verstecktes Feld im Formular schreiben, bevor es gesendet wird?

    
stef 02.01.2011 19:20
quelle
0

Um auf @ Malvolios Antwort zu erweitern: Sobald gaq das Ereignis sendet, wird das nächste Element in der Warteschlange verarbeitet. Dies bedeutet, dass die Ereignis-HTTP-Anforderung möglicherweise auf der Clientseite abgebrochen wird, GA jedoch die Anforderung erhält. Machen Sie sich keine Sorgen darüber, die Ausführung des Skripts zu blockieren, bis die Antwort beendet ist. Es ist ein Feuer und Vergessen-Szenario.

    
Herman J. Radtke III 15.02.2012 18:04
quelle