【发布时间】:2016-09-08 12:07:48
【问题描述】:
我似乎遇到了典型的“异步问题”,而我却找不到解决方案。
我有一个bootstrap form wizard,它只是一个临时的标签/幻灯片有点东西。我所有的“步骤”都是各自标签/幻灯片中的表格。
它有一组下一个/上一个按钮来浏览幻灯片。 并且它在移动到下一张幻灯片之前提供了一个函数回调。 在其中(回调)我正在“客户端验证”当前幻灯片中的表单,如果它经过验证,那么我将使用 ajax 提交表单。一旦我得到服务器的响应,我将决定是返回 true(继续下一张幻灯片)还是返回 false(停止导航到下一张幻灯片)。
我已经调查了..
- Using callbacks 但它不会阻止插件继续到下一张幻灯片,顺便说一句,这是一个硬编码的成功消息,所以在我们等待 ajax 响应时,向导已经移动到下一张幻灯片。
- 使用
async:false但这会像疯了一样挂起浏览器(按设计),直到请求完成,所以没有挂起这正是我想要的。
我的代码如下。
JS.
jQuery('#progressWizard').bootstrapWizard({
'nextSelector': '.next',
'previousSelector': '.previous',
onNext: function (tab, navigation, index) {
if (index == 1) { // Here I am deciding which code to execute based on the current slide/tab (index)
if (jQuery("#paymentstep1").data('bValidator').validate()) {
var data = new FormData(jQuery('#paymentstep1')[0]);
jQuery("#cgloader").fadeIn();
var success = false;
jQuery.ajax({
type: "post",
async: false,
contentType: false,
processData: false,
url: "xyz.php",
dataType: "json",
data: data,
success: function (r) {
return r;
}
});
}....
【问题讨论】:
-
第一种方法是唯一真正可接受的解决方案。如果这意味着更改向导插件,我仍然强烈推荐它。使用
async: false绝不是一种选择,因为正如您所见,它会挂起浏览器直到请求完成。这将使浏览器在用户看来就像崩溃一样,这是糟糕的用户体验。解决方法是使用异步请求。 -
停止导航到下一张幻灯片,然后在回调时重新启动
标签: javascript jquery ajax