Jquery Ajax调用set变量不会在调用之外持久存在

时间:2013-01-28 12:04:59

标签: php jquery json

不完全确定为什么会出错。 Jquery新手。根据我见过的所有例子,它应该有效,但事实并非如此。

在以下脚本中,该函数为变量设置新值,但新值不会在函数外部保留。 (控制台日志显示此内容)

$(document).ready(function() {

    // url
    var path = location.pathname.split("/"),
        pos1_path = path[1] != undefined ? path[1] : false,
        pos2_path = path[2] != undefined ? path[2] : false,
        pos3_path = path[3] != undefined ? path[3] :  false;

    //console.log('before: ' + pos2_path);
    if (pos1_path = 'article') {
        $.post("/js/ajax/article_crumbs.php", { func: "getArticleCrumbs" },
            function(data){
                pos2_path = data.category;
                //console.log('during: ' + pos2_path);
            return pos2_path}, "json");
    }
    //console.log('after: ' + pos2_path);

    // navigation
    // set category nav to current category
    if ( path[2] ) {
        $('#category_nav a[class$="' + pos2_path + '"]').toggleClass('current');
    }
    else {
        $('#category_nav a:first').toggleClass('current');
    }
});

PHP:

<?php echo json_encode(["category"=>"arts-and-culture"]);

另外,根据控制台打印输出,“after”打印出现在“during”之前,是否意味着该功能在脚本其余部分结束之前不会运行?

编辑:为了澄清,我需要保留 {if(path [1]) setcurrent } 部分脚本 {if(pos1_path ='article')} 部分,这样如果pos1_path不是文章,它会将值设置为URI中的任何内容。

根据以下答案

解决方案

$(document).ready(function() {

    // url
    var path = location.pathname.split("/"),
        pos1_path = path[1] != undefined ? path[1] : false,
        pos2_path = path[2] != undefined ? path[2] : false,
        pos3_path = path[3] != undefined ? path[3] :  false;

    if (pos1_path = 'article') {
        //console.log('before: ' + pos2_path);
        var data = {id: pos2_path}
        $.ajax({
            type: 'POST',
            url: "/js/ajax/article_crumbs.php",
            data: data,
            success: function(data){
                pos2_path = data.category;
                //console.log('during: ' + pos2_path);},
            dataType: "json",
            async: false
        });
    }
    //console.log('after: ' + pos2_path);

    // navigation
    // set category nav to current category
    if ( path[2] ) {
        $('#category_nav a[class$="' + pos2_path + '"]').toggleClass('current');
    }
    else {
        $('#category_nav a:first').toggleClass('current');
    }
}

3 个答案:

答案 0 :(得分:1)

$。发布请求是异步调用,所以很明显它会转移到其余的代码行而不是等待$ .post的回调

尝试使用$.ajax代替async=false使用相同的代码

$.ajax({
  type: 'POST',
  url: url,
  data: data,
  success: success,
  dataType: dataType,
  async:false
});

OR

将您的代码移到成功回调中。

答案 1 :(得分:0)

试试这个:

$(document).ready(function() {

    // url
    var path = location.pathname.split("/"),
        pos1_path = path[1] != undefined ? path[1] : false,
        pos2_path = path[2] != undefined ? path[2] : false,
        pos3_path = path[3] != undefined ? path[3] :  false;

    if (pos1_path = 'article') {
        var data = {id: pos2_path}
        $.post("/js/ajax/article_crumbs.php", { func: "getArticleCrumbs" },
            function(data){
                pos2_path = data.category;
                // navigation
                // set category nav to current category
                if ( path[1] ) {
                    $('#category_nav a[class$="' + pos2_path + '"]').toggleClass('current');
                }
                else {
                    $('#category_nav a:first').toggleClass('current');
                }
            }, "json");
    }
});

答案 2 :(得分:0)

这是一个异步调用...所以当控制到达if ( path[2] ) {语句时,你无法确定服务器是否有响应......

您可以success callback $.post

进行操作
$(document).ready(function() {

    // url
    var path = location.pathname.split("/"),
        pos1_path = path[1] != undefined ? path[1] : false,
        pos2_path = path[2] != undefined ? path[2] : false,
        pos3_path = path[3] != undefined ? path[3] :  false;

    //console.log('before: ' + pos2_path);
    if (pos1_path = 'article') {
        $.post("/js/ajax/article_crumbs.php", { func: "getArticleCrumbs" },
            function(data){
                pos2_path = data.category;
                if ( path[2] ) {
                    $('#category_nav a[class$="' + pos2_path +'"]').toggleClass('current');
                } else {
                    $('#category_nav a:first').toggleClass('current');
                }
            },"json")
    }
})