.unbind('submit')。submit()在Chrome / IE中运行但在Firefox中不起作用

时间:2013-11-12 21:35:02

标签: javascript jquery firefox

我使用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,我可以看到它是命中所有日志语句。

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

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

思想?

更新

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

我将其删除以简化代码,但在hindset中,它对于代码的工作非常重要。

更新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中逐步执行代码时代码有效,但是当我运行它时,数据库无法正常更新。

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分: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的提交。