我正在使用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
});
答案 0 :(得分:1)
重新触发JavaScript事件是否安全?
在这种情况下,没有。你触发了你所监听的同一事件,导致无限循环。
来自@ lyoshenka的评论:
我想重新启动jquery事件的原因是我还希望在表单提交(必要时确认提交,通过ajax提交等)上做其他事情在实际提交表单之前发生,但在记录GA事件之后发生。
感谢您提供最新信息。你的问题并不清楚。
鉴于您的基本工作流程是:
我建议只使用一个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();
}
});