Estoy trabajando en un script de seguimiento para un CRM bastante sofisticado para el seguimiento de acciones de formulario en Google Analytics. Estoy tratando de equilibrar el deseo de rastrear acciones de forma con precisión con el necesita para nunca evitar que un formulario no funcione.¿Qué tan peligroso es e.preventDefault() ;, y puede ser reemplazado por el seguimiento de teclas/mousedown?
Ahora, sé que hacer algo como esto no funciona.
$('form').submit(function(){
_gaq.push(['_trackEvent', 'Form', 'Submit', $(this).attr('action')]);
});
El DOM se descarga antes de que esto tenga la oportunidad de procesarse.
Por lo tanto, una gran cantidad de código de ejemplo recomienda algo como esto:
$('form').submit(function(e){
e.preventDefault();
var form = this;
_gaq.push(['_trackEvent', 'Form', 'Submit', $(this).attr('action')]);
//...do some other tracking stuff...
setTimeout(function(){
form.submit();
}, 400);
});
Ésta es fiable en most cases, pero me pone nervioso. ¿Qué sucede si ocurre algo entre e.preventDefault();
y cuándo me muevo para activar el envío basado en DOM? Rompí totalmente la forma.
He estado hurgando algunas otras implementaciones de análisis, y me he dado cuenta de something like this:
$('form').mousedown(function(){
_gaq.push(['_trackEvent', 'Form', 'Submit', $(this).attr('action')]);
});
$('form').keydown(function(e){
if(e.which===13) //if the keydown is the enter key
_gaq.push(['_trackEvent', 'Form', 'Submit', $(this).attr('action')]);
});
Básicamente, en lugar de interrumpir el envío de formulario, adelantándose a ella por el supuesto de que si alguien está pasando el ratón hacia abajo o tecleando abajo en Entrar, que ese formulario se envía. Obviamente, esto dará como resultado una cierta cantidad de falsos positivos, pero elimina por completo el uso de e.preventDefault();
, lo cual en mi opinión elimina el riesgo de que alguna vez evite que un formulario se envíe correctamente.
Por lo tanto, mi pregunta:
- ¿Es posible tomar la forma estándar fragmento de seguimiento y evitar que de vez prevenir totalmente la forma de presentar ?
- ¿Es viable la opción de mousedown/keydown ?
- ¿Hay algún caso de presentación que se puede perder? Específicamente, ¿hay otras formas de enviar archivos además del mouse y el teclado? ¿Y el navegador siempre tendrá tiempo para procesar javascript antes de comenzar a descargar la página?
Mmmm, déjame intentarlo de nuevo. La solución de simplemente esperar una cantidad arbitraria de tiempo y asumir que ahora es seguro abandonar la página está * garantizado * para (a) perder el tiempo de los usuarios o (b) fallar al salir temprano (las probabilidades de que adivine correctamente) cada vez puede ser ignorado). En su lugar, necesita una técnica mediante la cual se le notifica cuando se completa el seguimiento. Afortunadamente, Google Analytics Queue proporciona eso: todo lo que tiene que hacer es presionar un objeto de función al final de la cola. Una vez que todo lo que tiene delante en la cola se haya completado, esa función se ejecutará y enviará su formulario. – Malvolio
Ahora me doy cuenta de que también puede estar preocupado por el hecho de que "algo de rastreo" falla y por lo tanto causa que nunca se envíe el formulario. Para eso, sus dos opciones son, envolver todo el código pero enviar en un bloque try-except, que es seguro por descuidado, o simple no invocar preventDefault hasta la última línea de la función, por lo que si hay un error, ganó No se le llamará y la presentación * debería * continuar, lo cual es elegante, pero debe probarse cuidadosamente. – Malvolio
'_gaq.push ((function() {' debe ser '_gaq.push (function() {' – Thomas