2010-03-03 119 views
1

我之前问过一个related question,但我现在需要回答的问题现在似乎已经出现了一些特定的切线,所以我认为最好能提出一个新问题。jquery .submit return false not always working

我试图阻止表单提交,直到页面上的所有ajax调用都成功返回。

我对此有一个简单的测试(开始调用时加1到计数器,成功时减1)。

我相信我应该能够做到:

// can we submit yet? 
    $('#checkoutform').submit(function() { 
    if (ajaxcallcounter == 0) { 
     return true; 
    } 
    return false; 
    }); 

防止表单提交,直到计数器达到零(所有呼叫都完成),但由于某种原因,这似乎并没有100%有效。

我不知道这是一个红色的鲱鱼,但所有从谁管理,以检查出前调用已经完成了使用Mac的Safari客户的报告(这可能仅仅是虽然是巧合)

您可以看到代码正在执行here - 尝试更改发货国家以启动一些ajax呼叫。当计数器> 0时,应该禁用右下角的提交按钮。

+0

我没有对您的答案。我会说你在整个代码中做了大量的'ajaxcallcounter'递增和递减操作。您可能会发现有一个增量和减量函数可以被调用。然后你可以做一些简单的日志记录,看看他们何时被调用。 – user113716 2010-03-03 14:25:58

+0

嗨帕特里克,有很多增加和减少,因为有很多电话! :)我相信他们在正确的时间被调用,但表单被允许提交。 – Ashley 2010-03-05 11:09:10

回答

1

定义var ajaxcallcounter = 0;在你的功能之外。将它放在JavaScript文件的顶部以使其成为global variable

通常,您可以通过停止传播来确保您完全控制事件。每个事件处理程序都有一个隐式参数,通常定义为“e”或“event”,您可以调用preventDefault(),如下所示:

$('#checkoutform').submit(function(e) { 
    e.preventDefault(); 
    if (ajaxcallcounter == 0) { 
     return true; 
    } 
    return false; 
    }); 
+0

他已经这么做了。它不是全局的,但它在由jQuery“ready”函数形成的闭包中,其中定义了所有事件处理程序。此外,他几乎肯定不希望每次事件都“防止违约”。 – Pointy 2010-03-03 14:03:46

+0

是的,我知道它是在目前定义的东西的范围内,但是这种风格总是给我荨麻疹。在其他地方定义一个函数(例如,另一个js包括)太容易了,并且很奇怪为什么事情不能正常工作。 不要说提问者想要阻止所有的默认事件处理,只是在这种情况下,他们想要显式控制行为。 – Tom 2010-03-03 16:08:18

+0

嗨,汤姆,尖尖 - 我不明白preventDefault足够有信心使用它没有更多的解释。在汤姆提供的例子中,是否阻止默认的工作以不同的方式返回false,或者这是一种“腰带和大括号”的方法? – Ashley 2010-03-05 11:11:49