7
votes

Quelle est la dangereuse E.PreventDefault (); et peut-il être remplacé par le suivi de la clé / MouseDown?

Je travaille sur un script de suivi pour un CRM assez sophistiqué pour le suivi des actions de formulaire dans Google Analytics. J'essaie d'équilibrer le désir de suivre des actions de formulaire avec précision avec le besoin pour n'empêcher jamais un formulaire de ne pas fonctionner.

Maintenant, je sais que faire quelque chose comme ça ne fonctionne pas. xxx

Les décharges DOM avant que cela ait la possibilité de traiter.

Ainsi, beaucoup de code exemple recommande quelque chose comme ceci: xxx

ceci est fiable dans La plupart des cas , mais cela me rend nerveux. Et si quelque chose se passe entre e.preventdefault (); et quand je me déplace pour déclencher la soumission basée sur DOM? J'ai totalement cassé la forme.

J'ai perçu autour d'autres implémentations d'analyse et j'ai remarqué Quelque chose comme ça : xxx

essentiellement, au lieu d'interrompre le formulaire soumettre, préempter en supposant que si une personne est accumulée ou en saisissant bas sur ENTER, que ce formulaire est soumis. Évidemment, cela entraînera une certaine quantité de faux positifs, mais il élimine complètement l'utilisation de e.preventdefault (); , qui dans mon esprit élimine le risque que je puisse empêcher un formulaire de soumettre avec succès la soumission avec succès. .

Donc, ma question:

  • est-il possible de prendre la norme former le suivi des extraits et l'empêcher de jamais empêchant complètement le formulaire de soumettre?
  • est le MouseDown / Keedown Alternative viable?
  • Y a-t-il des cas de soumission qu'il me manque? Plus précisément, existe-t-il d'autres moyens de finir par soumettre à part la souris et le clavier entrer? Et le navigateur aura-t-il toujours le temps de traiter JavaScript avant de commencer à décharger la page?

0 commentaires

7 Réponses :


0
votes

une autre approche: xxx

Je devinerais de cette façon _trackevent serait synchrone mais je ne l'ai pas testé.


2 commentaires

GA étant asynchrone n'est pas le problème. L'aspect asynchrone fait référence à la chargement du script initialement, pas à des appels ultérieurs. Une fois que Ga.js charge, _gaq.push ('_ trackevent', ...) appels exécutez juste aussi rapidement que pagetracker._trackevent (...)


Si tel est le cas, vous pouvez envisager de rédiger votre propre fonction de trackedvant avec un gestionnaire de surlombie attaché à l'image __utm.gif, mais je pense que les gestionnaires de téléchargement pour les images ne sont pas aussi fiables dans certains navigateurs (par exemple, lorsqu'ils sont chargés de cache non tirés, mais Du chargement de cache ne devrait jamais arriver dans ce cas de toute façon). Une ancienne fonction de pagetrack: .google.com / p / Google-Analytics-JS / Source / Parcourir / Down / ...



31
votes

Les tombes de ce que Googleplex est affreux et figurait un jour quelque jour quelque jour, comme celui-ci était tenu de se produire et de maintenant, bien sûr, il a. Pourquoi ne donnez-vous pas cela un bon essai: xxx

que _gaq.push thigamajigger exécute ses éléments de manière séquentielle, de sorte que vous devriez être jestement bien.

et non, je ne sais pas pourquoi j'ai soudainement commencé à parler comme ça.


3 commentaires

Mmmm, laissez-moi essayer à nouveau. La solution consistant à attendre une quantité de temps arbitraire et en supposant qu'il soit maintenant sûr de laisser la page est garantie à (a) perdre l'heure des utilisateurs ou (b) échoue en laissant au début (le Les cotes que vous devinerez correctement à chaque fois peut être ignorée). Au lieu de cela, vous avez besoin d'une technique dans laquelle vous êtes notifié lorsque le suivi est terminé. Heureusement, la file d'attente Google Analytics prévoit que: Tout ce que vous avez à faire est de pousser un objet de fonction à la fin de la file d'attente. Une fois que tout l'avance dans la file d'attente est terminé, cette fonction sera exécutée et soumettre votre formulaire.


Je réalise maintenant que vous pouvez également vous inquiéter de l'échec de «certains trucs de suivi» et provoquez ainsi le formulaire de ne jamais être soumis. Pour que vos deux choix soient, enveloppez tout le code, mais la soumission dans un blocage, à l'exception du bloc, qui est en sécurité par bâcly ou simple, n'appelle pas Pêturdefault jusqu'à la dernière ligne de la fonction, alors s'il y a une erreur, il a gagné 'T soit appelé et la soumission devrait toujours traversée, ce qui est élégant mais devrait être soigneusement testé.


_gaq.push ((fonction (fonction () { doit être _gaq.push (fonction () {



3
votes

J'utilise une approche différente et génère le script de suivi des événements de la page résultant de la soumission. Vous pouvez appeler cela suivi des événements différés .

J'ai écrit un Blog Post Avec tous les détails sur mon approche du suivi des événements dans les actions de Backend. Il est biaisé vers Java-Struts, mais vous pouvez obtenir l'idée générale.

La justification est que je veux suivre certaines choses après leur arrivée au serveur. Dans ce type de cas, après la soumission du formulaire et traitée par le serveur.

Ce que je fais (très résumée):

  • stocker des événements dans un objet liés à la session (liste / file d'attente)
  • rincer ces événements sur la page suivante Render (générer le JavaScript et vider la file d'attente)

0 commentaires

0
votes

Y a-t-il une raison pour laquelle vous ne pouvez pas simplement émettre l'appel à Google Analytics du côté serveur en fonction du poste qu'il reçoit?

Je ne sais pas ce que votre système est intégré, mais par exemple, ce projet PHP émettrait un appel à GA, supprimant ainsi le problème du déchargement DOM, la nécessité de briser le formulaire, etc. < / p>

http://code.google.com/p/serversidegoogleanalytics/

Je me rends compte que vous pourriez avoir besoin de capturer un cookie - vous pouvez écrire la valeur dans un champ masqué sous la forme avant qu'il ne soit soumis?


3 commentaires

Cela pourrait fonctionner pour certaines personnes, mais malheureusement, dans cet environnement CMS, je n'ai pas accès au script du côté serveur. Tout doit être fait en JavaScript.


Et même si vous pouviez, vous payez pour les serveurs; Vos millions de clients apportent chacun son propre client.


Pour la postérité: le projet relié dans cette réponse a été retiré; Voir plutôt le nouveau projet code.google.com/p/php-ga



1
votes

e.preventDefault () ne doit pas être juste au début de l'appel de la fonction. Pourquoi pas seulement avoir une instruction si pour vérifier si tout fonctionne correctement et appelez uniquement e.preventdefault () si c'est le cas. Si une fonction de la chaîne ne renvoie pas le résultat attendu, définissez une variable Soumis sur false et n'empêchez pas la valeur par défaut.

Cela pourrait être un peu plus difficile à gérer lorsqu'il s'agit de quelque chose d'asynchrone (tel que votre Settimeout , mais il y aura des moyens de faire assez sûr, en fonction de votre ressemblance de votre code. Alors Vous pouvez vérifier si des méthodes existent avec si (_gaq.push) (par exemple). Vous ne pouvez pas faire 100% sûr sans tester chaque combinaison de chaque navigateur, mais je pense que vous pouvez obtenir une jolie résultat satisfaisant avec cela.


0 commentaires

3
votes

Si vous devez avoir des formulaires toujours travailler, mais le suivi peut être sacrifié si ce n'est absolument nécessaire, vous pouvez simplement essayer / l'attraper.

$('form').submit(function(e){
    try{
        e.preventDefault();
        var form = this; 
         _gaq.push('_trackEvent', 'Form', 'Submit', $(this).attr('action'));
        //...do some other tracking stuff...
        setTimeout(function(){
            form.submit();
        }, 400);
    } catch (e) {
        form.submit();
    }
});


2 commentaires

Mis en œuvre cette solution pour le même problème et bien fonctionné. Merci. Quelle est la raison exacte que Google a un problème avec le formulaire soumission et le suivi des événements? Au début, je pensais que c'était dû à la soumission de formulaire survenant et à recharger la page trop rapide pour que les données soient envoyées à Google, mais même après que j'ai ajouté la logique de SetTimeOut, il se produisait toujours. Seulement lorsque j'ai ajouté l'appel E.PreventDefault Tout a commencé à travailler à nouveau.


Réglage du délai d'attente n'est que la moitié de l'histoire. Si vous définissez un délai d'attente pour le formulaire Soumettre, mais n'étommez pas E.PreventDefault, vous laissez la soumission du formulaire se produire immédiatement (comme défaut de l'événement), qui préempte toujours l'appel à Analytics.



0
votes

Pour développer la réponse de @ Malvolio: Une fois que GAQ envoie l'événement L'élément suivant de la file d'attente traitera. Cela signifie que la demande HTTP d'événement peut interrompre du côté client, mais GA recevra la demande. Ne vous inquiétez pas de bloquer l'exécution du script avant la fin de la réponse. C'est un scénario d'incendie et d'oublie.


0 commentaires