2010-10-02 102 views
1

我有一個外部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.

爲什麼?

+2

你確定嗎?或者你認爲?由於Ajax的異步特性,在執行Ajax回調之前會執行'if(deleted)return true'。因此:你用調試器檢查過這個值嗎? – 2010-10-02 05:56:21

回答

5

Ajax是異步的,因此它會在執行if else檢查後設置deleted變量。試着把支票放回去。

0
$("#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