重新触发Javascript事件是否安全?

时间:2015-02-18 18:57:27

标签: javascript jquery forms javascript-events google-analytics

我正在使用Google Analytics并希望跟踪某些表单上的表单提交。我想确保在表单提交发生之前完成对Google Analytics的调用,否则Google Analytics可能不会注册该事件。我的应用程序已经有一堆代码在提交时发生(可能通过ajax提交表单,在弹出框中打开结果等)。

我的计划是在表单上收听submit事件,通过分析跟踪提交(如果表单具有正确的类),然后重新启动原始事件以继续进行正常的表单处理。这是第一个必须提交的监听器,所以它应该在其他人之前触发。这是否有效,这样做是否安全?

这是我的代码:

$('form').on('submit', function(event) {
  var form = $(this);
  if (form.hasClass('ga-event') && !event._ga_event_sent)
  {
    ga('send', {
      hitType: 'event',
      eventCategory: form.data('category'),
      eventAction: form.data('action'),
      eventLabel: form.data('label'),
      hitCallback: function() { // analytics calls this when its done
        event._ga_event_sent = true;
        form.trigger(event);
      }
    });
    return false;
  }

  // do other onSubmit stuff here
});

1 个答案:

答案 0 :(得分:1)

  

重新触发JavaScript事件是否安全?

在这种情况下,没有。你触发了你所监听的同一事件,导致无限循环。

更新#1:

来自@ lyoshenka的评论:

  

我想重新启动jquery事件的原因是我还希望在表单提交(必要时确认提交,通过ajax提交等)上做其他事情在实际提交表单之前发生,但在记录GA事件之后发生。

感谢您提供最新信息。你的问题并不清楚。

鉴于您的基本工作流程是:

  1. 向Google Analytics发送请求
  2. 更多验证+ AJAX
  3. 提交表格
  4. 我建议只使用一个submit事件处理程序来完成所有这三件事。根本问题是您需要以特定顺序运行这三个主要代码段,但它们彼此不了解。相反,将该逻辑合并到一个submit事件处理程序中,让您对这些事情的完成方式进行细致的控制 - 特别是因为您已经有多个需要进行的异步操作。

    $('form').on('submit', function(event) {
      event.preventDefault();
    
      var form = $(this);
    
      var otherSubmitActions = function() {
        // Do other validations, AJAX, etc.
        // Then in the final callback for your AJAX:
        // form[0].submit();
      };
    
      if (form.hasClass('ga-event')) {
        ga('send', {
          hitType: 'event',
          eventCategory: form.data('category'),
          eventAction: form.data('action'),
          eventLabel: form.data('label'),
          hitCallback: otherSubmitActions // analytics calls this when its done
        });
      } else {
        otherSubmitActions();
      }
    });