jQuery全局变量问题

时间:2010-03-02 19:35:14

标签: javascript jquery variables initialization global-variables

var id = $(this).children().html();  // id is 5
$.ajax({
   url: 'ajax.php?id=' + id,
   success: function(data) {
      id = data;   // id is 1
   }
});
if(id == 1){    // id is again 5
   ...
}

为什么在以下示例中我无法重新初始化id变量?有什么问题?

感谢。

6 个答案:

答案 0 :(得分:3)

$.ajax()函数必须去获取数据,它没有这样做,并且在它到达代码之后立即执行成功回调。

您的代码顺序实际上是这样的:

var id = $(this).children().html();
//Ajax start
if(id == 1){ }
//Ajax end (sometime later, not immediately after)
function(data) { id = data; }

如果您依赖此值继续,请将其粘贴在成功回调中:

var id = $(this).children().html();  // id is 5
$.ajax({
   url: 'ajax.php?id=' + id,
   success: function(data) {
      id = data;   // id is 1
      if(id == 1){    // id is now 1
        ...
      }
   }
});

答案 1 :(得分:2)

重构这样的代码会起作用:

function by_id() {
 if(id == 1) {   
   ... do something ...
 }
}

var id = $(this).children().html();
$.ajax({
   url: 'ajax.php?id=' + id,
   success: function(data) {
      id = data;
      by_id();  // call on successful ajax load
   }
});

id逻辑包装在函数中的优势允许您在任何地方调用它 - 无论是在AJAX请求结束时,页面加载时,按下按钮等等。

答案 2 :(得分:1)

您的 if 语句在 .ajax 调用完成之前执行

答案 3 :(得分:1)

Ajax中的A用于异步。在'success'回调中,您可以调用另一个函数或执行post-ajax代码。

答案 4 :(得分:1)

嘿,更好的解决方案是使用 async:false 属性,如下所示:

var id = $(this).children().html();  // id is 5
$.ajax({
   url: 'ajax.php?id=' + id,
   async: false,
   success: function(data) {
      id = data;   // id is 1
   }
});
if(id == 1){    // id is again 5
   ...
}

答案 5 :(得分:0)

AJAX函数是异步的。它将在后台运行,当它完成获取ajax.php页面后,它将运行成功函数。