e.preventDefault();有多危险,可以用keydown/mousedown跟踪代替吗?

Yah*_*hel 7 javascript jquery analytics google-analytics javascript-events

我正在为一个相当复杂的CRM制作跟踪脚本,以跟踪Google Analytics中的表单操作.我试图平衡与准确地跟踪表单操作的欲望需要永不防止形式从不工作.

现在,我知道做这样的事情是行不通的.

$('form').submit(function(){
 _gaq.push(['_trackEvent', 'Form', 'Submit', $(this).attr('action')]);
});
Run Code Online (Sandbox Code Playgroud)

在有机会处理之前,DOM会卸载.

所以,很多示例代码推荐如下:

$('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);
});
Run Code Online (Sandbox Code Playgroud)

大多数情况下这是可靠的,但它让我感到紧张.如果e.preventDefault();在我之间触发基于DOM的提交之间发生了什么事情怎么办?我完全打破了这个形式.

我一直在寻找其他一些分析实现,我注意到这样的事情:

$('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')]);
});
Run Code Online (Sandbox Code Playgroud)

基本上,不是中断表单提交,而是通过假设某人正在关闭或键入Enter来取代该表单,而不是提交该表单.显然,这将导致一定数量的误报,但它完全消除了使用e.preventDefault();,这在我看来消除了我可能阻止表单成功提交的风险.

所以,我的问题:

  • 是否有可能采取标准形式的跟踪代码,防止它曾经完全防止形式从提交?
  • mousedown/keydown替代方案是否可行?
  • 是否有可能错过的提交案例?具体来说,除了鼠标和键盘之外,还有其他方式可以提交吗?在开始卸载页面之前,浏览器是否总是有时间处理javascript?

Mal*_*lio 30

他们在那里聚集了Googleplex非常聪明,他们有一天会想到这样的事情,因为这肯定会发生,而现在,确实如此.你为什么不试试这个:

$('form').submit(function(e){
  e.preventDefault();
  var form = this; 
  _gaq.push(['_trackEvent', 'Form', 'Submit', $(this).attr('action')]);
  //...do some other tracking stuff...
  _gaq.push(function(){
     form.submit();
    });
  });
Run Code Online (Sandbox Code Playgroud)

_gaq.pushthigamajigger顺序执行它的元素,所以你应该是开玩笑的罚款.

不,我不知道为什么我突然开始这么说.

  • 我意识到你现在也可能担心"一些跟踪内容"失败,从而导致表单永远不会被提交.为了你的两个选择,包装所有的代码,但提交在一个try-except块,这是安全的草率,或简单不要调用preventDefault直到函数的最后一行,所以如果有一个错误,它赢了不应该打电话,提交*应该*仍然通过,这是优雅的,但应该仔细测试. (7认同)
  • 嗯,让我再试一次.只需等待任意时间并假设现在可以安全地离开页面的解决方案*保证*(a)浪费用户时间或(b)通过提前离开而失败(你猜错的几率)每次都可以被忽视).相反,您需要一种技术,在跟踪完成时通知您.幸运的是,Google Analytics Queue规定:您所要做的就是在队列末尾推送一个功能对象.一旦队列中的所有内容都完成,该功能将被执行并提交您的表单. (4认同)