2011-03-28 46 views
0

我有波紋管功能。 這裏我想從用戶定義的函數返回ajax成功。如何做到這一點如何從用戶定義函數返回ajax suceess

alert(Ajaxcall(id_array,"del")); 

function Ajaxcall(id_array,type){ 
      $.ajax({ 
        type: "POST", 
        url: "serverpage.php", 
        cache:false, 
        data: ({id:id_array,type:type}), 
        success: function(msg){ 

        return msg; //this returns nothing 

        } 
      }); 

      alert(msg); // this one undefined 

} 

感謝

回答

3

的「一」,在「AJAX」代表「異步」(「異步JavaScript和XML」,雖然這些天大多數人使用JSON而不是XML使用它) 。

因此,您的Ajaxcall函數在ajax調用完成之前返回,這就是爲什麼您不能將該消息作爲返回值返回的原因。

通常要做的事情是在回調,而不是經過:

Ajaxcall(id_array,"del", functon(msg) { 
    alert(msg); 
}); 

function Ajaxcall(id_array,type, callback){ 
      $.ajax({ 
        type: "POST", 
        url: "serverpage.php", 
        cache:false, 
        data: ({id:id_array,type:type}), 
        success: function(msg){ 

         callback(msg); 

        } 
      }); 
} 

它是用JavaScript非常容易,因爲JavaScript的功能是closures,可以聯定義。因此,舉例來說,假設你想做到這一點:

function foo() { 
    var ajaxStuff, localData; 

    localData = doSomething(); 
    ajaxStuff = getAjaxStuff(); 
    doSomethingElse(ajaxStuff); 
    doAnotherThing(localData); 
} 

你可以從字面上重寫異步像這樣:

function foo() { 
    var localData; 

    localData = doSomething(); 
    getAjaxStuff(function(ajaxStuff) { 
     doSomethingElse(ajaxStuff); 
     doAnotherThing(localData); 
    }); 
} 

我要指出,這是可能使Ajax調用同步。在jQuery中,通過傳入async選項(設置爲false)來完成此操作。但它是一個非常糟糕的想法。同步ajax調用以非常不友好的方式鎖定大多數瀏覽器的用戶界面。相反,像上面那樣稍微重構你的代碼。

但只是爲了完整性:

alert(Ajaxcall(id_array,"del")); 

function Ajaxcall(id_array,type){ 
    var returnValue; 
      $.ajax({ 
        type: "POST", 
        url: "serverpage.php", 
        cache:false, 
        async: false,  // <== Synchronous request, very bad idea 
        data: ({id:id_array,type:type}), 
        success: function(msg){ 

         returnValue = msg; 

        } 
      }); 
    return returnValue; 
} 
+0

ca我在該回調之外使用msg Ajaxcall(id_array,「del」,function(msg){\t \t});警報(MSG);像這樣 – Gowri 2011-03-28 07:27:59

+0

@gowri,不,回調之外不存在'msg'。 – 2011-03-28 07:31:28

+0

@gowri:您可以將它分配給您在包含範圍中聲明的變量,但是,您必須再次異步考慮 - 是否會在您使用它時設置它?這就是爲什麼我舉了一個例子,說明在JavaScript中修改循序漸進的邏輯以處理異步性非常簡單。在異步操作的時候,啓動一個新的函數,並將所有應該跟隨*的內容移到該函數中。你甚至可以嵌套這些。 – 2011-03-28 07:32:05

1

jQuery有一些全局AJAX事件處理程序,包括$.ajaxComplete()$.ajaxSuccess()(參考文獻:http://api.jquery.com/ajaxSuccess/)。

的代碼可以連接到任何DOM元素,看起來像這樣:只要任何成功的Ajax調用完成

/* Gets called when all request completes successfully */ 
     $("#myElement").ajaxSuccess(function(event,request,settings){ 
      $(this).html("<h4>Successful ajax request</h4>"); 
     }); 

此代碼將被執行。