0

我有以下使用 jquery 1.9.1 的 javascript 代码:

(function ($) {
$(function () {
    eventTracking();
});

function eventTracking() {
    $("[data-formtracking]").bind('submit', function (e) {
        e.preventDefault();
        var eventName = $(this).data("formtracking");
        rt.trackEvent(eventName);
        $(this).unbind('submit').submit();
    });
}})(jQuery);

现在,当我提交表单时,它应该对数据库进行更新,然后按照表单上的操作,基本上将我们重定向到另一个页面。

在 Chrome/IE 中,rt.trackEvent 成功触发,我被重定向到另一个站点。在 Firefox 中,我被重定向到另一个站点,但没有数据库条目。

如果我在每个语句之间添加 console.log,我可以看到它命中了所有的日志语句。

所以在这一点上......我很困惑。我试过从绑定切换到开/关。我试过: $('input[type=submit]', this).click() 基于另一个stackoverflow页面上的传递评论。

一些注意事项: * rt 在外部文件中。我已经检查过它确实存在 * 如果我删除了 unbind.submit,那么 rt.trackEvent 可以正常工作,除了页面没有重定向(显然)。* 我已将 unbind.submit() 更改为其他变体,但在提交之前我必须单击该按钮两次。

想法?

更新

e.preventDefault() 和稍后提交的原因是表单提交发生得太快。该页面将在 rt.trackEvent 正常工作之前重定向。所以我需要通过添加一个 setTimeout($(this).unbind('submit').submit(), 2000);

我删除了它以简化代码,但归根结底,它对于代码的工作非常重要。

更新 2 这是被调用的 json:

        options = $.extend({ success: $.noop, error: $.noop, urlBuilder: getNoCookieRequestURL, eventName: null }, options);

        options.url = options.urlBuilder(options.url, options.siteId, options.eventName);
        $.getJSON(options.url, function (jsonp) {
            options.success(jsonp);
        }).fail(function () {
            options.error();
        });

更新 3

将 getJson 更改为:

            options = $.extend({ success: $.noop, error: $.noop, urlBuilder: getNoCookieRequestURL, eventName: null }, options);

        options.url = options.urlBuilder(options.url, options.siteId, options.eventName);

        $.ajax({
            url: options.url,
            dataType: 'json',
            async: false,
            success: function (jsonp) {
                options.success(jsonp);
            },
            error: function() {
                options.error();
            }
        });

我似乎仍然遇到速度问题。当我在 Chrome 中逐步执行代码时,代码可以工作,但是当我运行它时,数据库没有正确更新。

4

2 回答 2

1

不要解绑,提交即可。

// $(this).unbind('submit').submit();
this.submit();

不过,我想知道如果您仍然要提交它,为什么您首先要阻止提交。

(function ($) {
$(function () {
    eventTracking();
});

function eventTracking() {
    $("[data-formtracking]").bind('submit', function (e) {
        //e.preventDefault();
        var eventName = $(this).data("formtracking");
        rt.trackEvent(eventName);
        //$(this).unbind('submit').submit();
    });
}})(jQuery);
于 2013-11-12T21:36:49.257 回答
0

所以不确定这是否是世界上最漂亮的,但它现在可以工作了……这是一个巨大的进步。

    $("[data-formtracking]").bind('submit', function (e) {
        e.preventDefault();
        form = this;
        var eventName = $(this).data("formtracking");
        rt.trackEvent(eventName);

        setTimeout(function() {
            form.submit();
        }, 100);
    });

基本上,问题似乎与使用 jquery 解除绑定和重新提交有关,所以我们解决了这个问题并改用了 javascript 的提交。

于 2013-11-13T16:19:10.783 回答