Sto lavorando a uno script di monitoraggio per un CRM abbastanza sofisticato per il monitoraggio delle azioni del modulo in Google Analytics. Sto cercando di bilanciare il desiderio di tracciare accuratamente le azioni del modulo con il necessario per per evitare che un modulo non funzioni.Quanto è pericoloso e.preventDefault(); e può essere sostituito dal monitoraggio keydown/mouse?
Ora, so che fare qualcosa del genere non funziona.
$('form').submit(function(){
_gaq.push(['_trackEvent', 'Form', 'Submit', $(this).attr('action')]);
});
Il DOM scarica prima che questo abbia la possibilità di elaborare.
Così, un sacco di codice di esempio suggerisce qualcosa di simile:
$('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);
});
Questo è affidabile in most cases, ma mi rende nervoso. Cosa succede se succede qualcosa tra e.preventDefault();
e quando riesco ad attivare l'invio basato su DOM? Ho completamente rotto il modulo.
ho rovistando alcune altre implementazioni di analisi, e ho notato 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')]);
});
In sostanza, invece di interrompere l'invio di modulo, si preempting assumendo che se qualcuno sta passando con il mouse verso il basso o la digitazione giù su Invio, di quel modulo è presentato. Ovviamente, questo si tradurrà in una certa quantità di falsi positivi, ma elimina completamente l'uso di e.preventDefault();
, che nella mia mente elimina il rischio che io possa mai impedire a un modulo di inviare correttamente.
Quindi, la mia domanda:
- E 'possibile prendere lo standard documento di accompagnamento frammento e impedire che da mai impedendo completamente la forma di presentare?
- L'alternativa mousedown/keydown è valida?
- Esistono casi di presentazione che potrebbero non essere disponibili? In particolare, ci sono altri modi per finire di inviare oltre al mouse e alla tastiera entrare? E il browser avrà sempre tempo per elaborare javascript prima di iniziare a scaricare la pagina?
Mmmm, fammi riprovare. La soluzione di aspettare solo una quantità arbitraria di tempo e supponendo che ora sia sicuro di lasciare la pagina è * garantita * per (a) sprecare il tempo degli utenti o (b) fallire andando in anticipo (le probabilità indovineranno correttamente ogni volta può essere ignorato). Invece hai bisogno di una tecnica con cui ti viene notificato quando il monitoraggio è completo. Fortunatamente, la coda di Google Analytics prevede che: tutto ciò che devi fare è premere un oggetto funzione alla fine della coda. Una volta completato tutto ciò che si trova nella coda, tale funzione verrà eseguita e invierà il modulo. – Malvolio
Ora mi rendo conto che potresti anche essere preoccupato per il fatto che "alcuni elementi di monitoraggio" non siano riusciti e che quindi il modulo non venga mai inviato. Per questo le tue due scelte sono, avvolgi tutto il codice ma l'invio in un blocco try-except, che è sicuro da sciatto, o semplice non chiamare preventDefault fino all'ultima riga della funzione, quindi se c'è un errore, ha vinto essere chiamato e la presentazione * dovrebbe * continuare ancora, che è elegante ma dovrebbe essere attentamente testata. – Malvolio
'_gaq.push ((function() {' dovrebbe essere '_gaq.push (function() {' – Thomas