2012-03-23 86 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