为什么Javascript全局变量不是全局的?
问题描述:
我有一个外部js文件处理删除某些元素。根据结果,我会确定是否需要刷新页面。为什么Javascript全局变量不是全局的?
var deleted = 0; // first assume not deleted
$(function() {
$("#action a.action-delete").click(function() {
var id = $(this).parent().parent().attr("id");
$.get("modify-sale.php", { "id" : id, "action" : "delete" }, function (data) { deleted = 1; }, "text");
if (deleted) return true; // if success then refresh
else return false; // else does not refresh
});
没有问题是我无法改变的全局变量deleted
在jQuery的事件处理程序。我可以保证删除操作是成功的,但是这个变量不会将其值更改为1.
为什么?
答
Ajax是异步的,因此它会在执行if else
检查后设置deleted
变量。试着把支票放回去。
答
$("#action a.action-delete").click(function() {
var id = $(this).parent().parent().attr("id");
$.ajax({
"url" : "modify-sale.php",
"type" : "GET",
"data" : { "id" : id, "action" : "delete" },
"dataType" : "text",
"async" : false,
"success" : function(data) {
if (data == 'success') {
$("#msg").text("delete success").show();
$("#msg").fadeOut(1000);
deleted = 1;
} else {
$("#msg").text("delete failed, plesase try later").show();
$("#msg").fadeOut(5000);
}
},
"error" : function() {
$("#msg").text("delete failed, please try later").show();
$("#msg").fadeOut(5000);
}
});
if (deleted) return true;
else return false;
});
我修正了异步设置为同步。
+0
为什么你需要返回真或假?如果它没有被删除会发生什么?尽量避免同步请求。 – 2010-10-02 06:56:31
你确定吗?或者你认为?由于Ajax的异步特性,在执行Ajax回调之前会执行'if(deleted)return true'。因此:你用调试器检查过这个值吗? – 2010-10-02 05:56:21