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

Is it safe to re-trigger a Javascript event?

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

我的计划是监听表单上的 submit 事件,通过分析跟踪提交(如果表单有正确的 class),然后重新触发原始事件以继续执行正常表单加工。这是必须提交的第一个侦听器,因此它应该在其他任何人执行之前触发。这行得通吗,这样做安全吗?

这是我的代码:

$('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
});

Is it safe to re-trigger a JavaScript event?

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

更新 #1:

来自@lyoshenka 的评论:

The reason I want to re-fire the jquery event is that there's other stuff that I'd like to do on form submission (confirm submit if necessary, submit via ajax, etc) that still needs to happen before the form is actually submitted, but after the GA event is logged.

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

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

  1. 向 Google Analytics 发送请求
  2. 更多验证 + AJAX
  3. 提交表单

我建议只使用一个 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();
  }
});