jquery即兴 - 保持提示打开,直到处理异步AJAX响应

时间:2012-09-20 15:39:30

标签: javascript jquery impromptu

简而言之
我想在用户点击“确定”按钮后进行一些异步服务器端验证(使用AJAX)。如果验证失败,我想在不关闭它的情况下在提示上显示错误消息。

详情

我正在使用即兴版本3.1。我找不到3.1的文档,所以在documentation for version 4.0.1中检查了有两种方法可以做到这一点 -

  

返回false或event.preventDefault()以保持提示打开

我检查过,因为我使用的是旧版本,因此事件变量在这样的函数中不可用 -

$.prompt('Example 2',{ buttons: { Ok: true, Cancel: false }, submit: submitCertificationPrompt } });

function submitCertificationPrompt(e,v,m,f)
{
 //e is not available in case of version 3.0.1
}

我现在无法升级到最新版本,因为我们在3.1版插件代码上进行了一些自定义。

所以,我只能使用return false方式。我检查过这个有效 -

 $.prompt('Example 2',{ buttons: { Ok: true, Cancel: false }, submit: submitCertificationPrompt } });

    function submitCertificationPrompt()
    {
       return false;
    }

但是,因为我必须等到收到AJAX响应,所以我尝试使用像这样的javascript回调函数,但它没有像我预期的那样工作 -

$.prompt('Example 2',{ buttons: { Ok: true, Cancel: false }, submit: function(){ submitCertificationPrompt(function(bool){ return bool; }) } });

function submitCertificationPrompt(callback)
{
    //I will do an AJAX call here and the prompt should stay open if the response reads validation error. So, I will callback false in that case

    callback(false);
}

请帮忙......

2 个答案:

答案 0 :(得分:1)

你需要做一个小改动,只需添加一个参数async:false,你在这里调用ajax

 $.ajax(
                        {
                            type: 'POST',
                            url: '/Path/TestPost',
                            async: false,
                            data: form.serialize(),
                            success: function(data) {

}

更多信息:Keep impromptu "up" while performing a jquery Ajax/MVC post

答案 1 :(得分:0)

好吧,我不太清楚你在做什么,但利用了$ .ajax正在实施jQuery deferred interface的事实:

$.ajax({
    // the opts for the call.
    // see the documentation.
}).promise().then(function()
{
    // this gets executed when the ajax call comes back with an OK HTTP code like 200
    // perform console.log(arguments) here to see what you get.
}, function()
{
    // this gets executed when the ajax call comes back with an ERROR HTTP code like 500
    // perform console.log(arguments) here to see what you get.
}).always(function()
{
    // this gets always executed.
    // perform console.log(arguments) here to see what you get.
});