2012-04-03 82 views
1

我在页面上有一堆文本框和提交按钮。我已经连接了文本框的TextChanged事件来执行服务器端方法。用户在文本框中输入值,将标签输出到下一个文本框(触发textchanged事件),最后单击提交按钮,调用另一个服务器端方法。所有的功能都是异步的。提交方法只有在textchange方法完成后才需要执行,因为它们共享相同的数据。问题有时textchange方法需要稍长的时间才能完成,并且submitchange方法在textchange函数完成之前触发。我如何防止这种情况?我如何锁定/排队功能?jquery - 防止这种竞争条件

回答

1

不要锁定或排队任何东西!只需禁用提交按钮,直到更改事件+ ajax完成。

$('#submitBtn').attr('disabled', 'disabled'); 

或者jQuery的1.6+:

$('#submitBtn').prop('disabled', true); 

而当变化AJAX完成:

$('#submitBtn').attr('disabled', '');//or $('#submitBtn').prop('disabled', false) 
+0

我以前想过这个,但在我的情况下,问题是当用户在最后一个文本框中时,他们不会触发文本框的更改功能。他们直接点击提交按钮(然后触发文本框的更改功能)。如果我禁用提交,他们不会单击按钮或表单上的任何其他位置来触发更改。还有其他建议吗? – tempid 2012-04-03 22:19:15

+0

@enigma。然后在所有更改事件完成时用真正的标志保存。捕获提交事件,如果该标记为false,则防止默认。那个怎么样? – gdoron 2012-04-04 08:29:33

+0

谢谢,这是我最终做的,它似乎工作正常。 – tempid 2012-04-18 17:06:43