0

请在这件事上给予我帮助...

我必须将值传递给 php 文件进行保存,但是如果选中了一个复选框,它必须使用第一个返回值执行第二个 jquery 帖子。但似乎第二个 jquery 帖子首先被执行,这是我的代码:

if($action=="save_prod")
    {   
        var remember = document.getElementById('chk');
        var $suppid=document.getElementById('supp').value;
        var $categlist=document.getElementById('categlist').value;
        var $prodname=document.getElementById('prodname').value;
        var $proddesc=document.getElementById('proddesc').value;

        $.post(baseurl+'index.php/main/newproduct',{"categlist" : $categlist,"prodname" : $prodname," proddesc" : $proddesc,"supp" : $suppid},function(response) 
        {
        $lastid=response;
                if($lastid != 0)
                {
                    alert("Product has been saved with ID=" + $lastid);
                    document.getElementById('resp').style.display='none';
                    document.getElementById('fade').style.display='none';
                    window.location.href=baseurl +"index.php/main/mgtprods/?key="+ $suppid;
                }
            });

        if (remember.checked)
         {
            //alert($lastid);
            $.post(baseurl+'index.php/main/newitem',{"prodlist" : $lastid ,"itlist" : 0,"itcost" : 0, "supp" : $suppid, "itname" : $prodname, "itunit" : "pc" },function(response) 
            {
                document.getElementById('resp').style.display='none';
                document.getElementById('fade').style.display='none';
                //window.location.href=baseurl +"index.php/main/mgtprods/?key="+ $suppid;
            });

         }  
    }

太感谢了!

4

2 回答 2

2

jQuery ajax 函数 ( $.ajax(), $.get(), $.post()... ) 都返回一个包含底层对象的DeferredjqXHR对象。

利用该Deferred.then()函数链接两个异步调用:

//your first $.post :
$.post(...)
.then(function(){
    if (remember.checked) {
        //your second $.post :
        $.post(...);
    } 
});

以这种方式使用它,只有在第一次调用成功时才会调用第二个函数(如果第一次调用导致错误,则不会触发任何内容)。


您的第一个回调包含重定向:window.location.href=baseurl +"index.php/main/mgtprods/?key="+ $suppid;。当您要执行此重定向时,您必须更精确地选择。

这是一种在第二次调用 ifremember被检查后触发重定向的方法,或者在第一次调用 ifremember未被检查后通过链接Deferred对象触发重定向:

$.post(... /* remove the redirection from the first callback */)
.then(function(){
    if (remember.checked) {
        //your second $.post : return the Deferred corresponding to this call
        return $.post(... /* remove the redirection from the second callback */);
    } else {
        // else, return the first Deferred object :
        return this;
    }
}).then(function(){
    /* do your redirection here : */
    window.location.href=baseurl +"index.php/main/mgtprods/?key="+ $suppid;
});

小提琴

于 2013-09-11T08:24:40.723 回答
0

尝试这个...

if($action=="save_prod") {   
    var remember = document.getElementById('chk');
    var $suppid=document.getElementById('supp').value;
    var $categlist=document.getElementById('categlist').value;
    var $prodname=document.getElementById('prodname').value;
    var $proddesc=document.getElementById('proddesc').value;

    $.post(baseurl+'index.php/main/newproduct',{"categlist" : $categlist,"prodname" : $prodname," proddesc" : $proddesc,"supp" : $suppid},function(response) {
        $lastid=response;
        if (remember.checked) {
            //alert($lastid);
            $.post(baseurl+'index.php/main/newitem',{"prodlist" : $lastid ,"itlist" : 0,"itcost" : 0, "supp" : $suppid, "itname" : $prodname, "itunit" : "pc" },function(response) {
                document.getElementById('resp').style.display='none';
                document.getElementById('fade').style.display='none';
                //window.location.href=baseurl +"index.php/main/mgtprods/?key="+ $suppid;
            });
        }  
        if($lastid != 0) {
            alert("Product has been saved with ID=" + $lastid);
            document.getElementById('resp').style.display='none';
            document.getElementById('fade').style.display='none';
            window.location.href=baseurl +"index.php/main/mgtprods/?key="+ $suppid;
        }
    });
}

我所做的只是将第二个帖子移到第一个的回调函数中。您也可以.done()在第一篇文章中添加一个方法,然后在其中添加第二个,但效果相同。

于 2013-09-11T08:26:05.257 回答