jQuery变量scope - 变量不会更改其值

时间:2015-12-24 22:37:39

标签: jquery variables

我有一些代码,我将变量定义为某个值,但是在ajax请求期间,必须更改该值。当我发出警报以检查值是否已更改时,变量仍具有旧值。有问题的变量是“行动”。请看一下:

$(function(){
    var $action; //this one is the problem
    var $mod;

    $(".main-nav li > a").click(function(){
        $(this).parent().siblings().find(".inner-nav").hide();
        $(this).parent().siblings().children("a").attr("id","");

        if ($(this).attr('id')=='nav-active')
        {
            $(this).attr('id','');
        }
        else
        {
            $(this).attr('id','nav-active');
        }

        $(this).parent().find(".inner-nav").toggle();
    });

    $(".main-nav li .inner-nav li a").click(function(){
        $(this).parent().siblings().find("a").attr("id","");
        $(".main-nav .inner-nav li a").attr("id","");

        $(this).attr('id','nav-active');

        // ajax

        var rel = $(this).attr("rel");
        var rel_arr = rel.split(',');

        $action = rel_arr[0]; //first change of value
        $mod = rel_arr[1];

        $.ajax({
            url: 'ajaxLoad.php?action='+$action+'&mod='+$mod,
            method: 'GET',
            success: function(response) {
                $(".content div").html("");

                $action = response.ajax.action; //second change of value
                $mod = response.ajax.mod;

                $.each(response.data, function(id, product){
                    $(".content > div").append("<div>"+product.name+"</div>");
                });
            }
        });

        alert ($action); //prints out the first value

        // Set document title
        var parentClass = $(this).parent().parent().parent().find("a").html();
        document.title = parentClass + " :: " + $(this).html();
    });
});

2 个答案:

答案 0 :(得分:0)

Ajax请求是异步完成的,因此控制会立即返回到您的脚本。在ajax请求启动之后但在ajax完成之前运行$.ajax调用后放置的代码。如果你想在ajax完成后运行某些东西,你必须把它放在你的成功回调中。

答案 1 :(得分:0)

我找到了解决方案。这与Chad的贡献有关,即问题在于异步完成请求。要解决这个问题,我必须执行以下操作:

$.ajax({
    async: false, //add this
    cache: false, //and this
    url: 'ajaxLoad.php?action='+$action+'&mod='+$mod,
    method: 'GET',
    success: function(response) {
        $(".content div").html("");

        $action = response.ajax.action;
        $mod = response.ajax.mod;

        $.each(response.data, function(id, product){
            $(".content > div").append("<div>"+product.name+"</div>");
        });
    }
});