2012-03-23 85 views
-2

使用下面的代碼,它應該提醒'one',然後'two'。當我按.button時,只有'one'被提醒。 var got未返回到.button函數。返回值jquery函數

$('.button').live('click',function() { 
var got = fetchvalue('100'); 

    if(got==1) { 
    alert('two'); 

    } 

}); 


function fetchvalue(id) { 

    $.getJSON('/fetchvalue.php?id='+id+'&w=1',function(data) { 

alert('one');  
    var got=1;     

    }); 

    return got; 
} 

回答

0

那是因爲你的變量got範圍限定爲您的JSON返回功能(即你不能訪問它的JSON回調函數之外),加上JSON負載是異步的。您可以使用$ .ajax調用,並將async設置爲false,但效果相同,但沒有異步加載,這意味着您在回調中設置的任何變量都不會(有效)限定於該範圍。

function fetchvalue(id) { 
    var got; 
    $.ajax({ 

     url: '/fetchvalue.php?id=' + id + '&w=1', 
     dataType: 'json', 
     async: false, 
     data: myData, 
     success: function(data) { 
      alert('one'); 
      got = 1; 
     } 
    }); 

    return got; 
}​ 
+0

這將不作爲的getJSON功能工作當ajax調用完成時,調用將被異步調用,這是原始代碼的一個問題。 – joshuahealy 2012-03-23 04:23:33

+0

我已編輯以反映您的評論,謝謝指出。 – 2012-03-23 04:30:48

5

getJSON是異步的,這意味着它是不可能馬上得到這個調用語句的返回值,所以你的代碼應該是:

$('.button').live('click',function() { 
    fetchvalue('100', function(got) { // add a callback 
     if (got == 1) { 
      alert('two'); 
     } 
    }); 
}); 


function fetchvalue(id, callback) { 
    $.getJSON('/fetchvalue.php?id='+id+'&w=1',function(data) { 
     alert('one');  
     var got=1; 
     callback(got); // invoke the callback 
    }); 

    // no return is required 
} 
+0

根據http://api.jquery.com/live/「從jQuery 1.7開始,.live()方法已被廢棄,使用.on()附加事件處理程序,老版本的jQuery用戶應該使用.delegate ()優先於.live()「。 – Jayanga 2012-03-23 08:25:28

+0

謝謝你。你節省了我的時間.. – 2015-04-14 11:04:25