jQuery的执行顺序
考虑下面的代码:jQuery的执行顺序
function searchText() {
if($('#searchtext').val() == null || $('#searchtext').val().trim() == '') {
alert('must provide a text to search for');
return false;
}
urllink='http://search.twitter.com/search.json?q=' + escape($('#searchtext').val().trim()) + '&callback=?';
$('#results').html(urllink);
$.getJSON(urllink,function(data) {
var resultT = {};
$('#results').html(data.results[0].profile_image_url);
return data.results;
});
}
$('#gosearch').click(function() {
var data = searchText();
if(data == null)
alert('null');
return false;
});
我有萤火断点在searchText()
return data.results
。但似乎searchText
被执行,但我不停止在我的突破点。它宁可检查数据,它是null
,并执行alert('null')
。那么它会在searchText
的折扣点停止。
这是怎么发生的?我不能在事件中执行函数并等待它们完成,然后再移动到代码中的下一行?
感谢
你没有意识到AJAX是一个同步。所以当searchText()
返回ajax请求尚未完成。您需要传递回调并执行该操作,而不是执行return data.results;
。
下面是一个例子:
function searchText(callback) {
if ($('#searchtext').val() == null || $('#searchtext').val().trim() == '') {
alert('must provide a text to search for');
return false;
}
urllink = 'http://search.twitter.com/search.json?q=' + escape($('#searchtext').val().trim()) + '&callback=?';
$('#results').html(urllink);
$.getJSON(urllink, function (data) {
var resultT = {};
$('#results').html(data.results[0].profile_image_url);
callback(data.results);
});
}
$('#gosearch').click(function(e) {
e.preventDefault();
searchText(function(data) {
if (data == null) alert('null');
// do something with your data
});
});
我相信因为这是一个JSONP跨域请求,所以我无法执行同步$ .ajax,对吗?我明白你在说什么,但是这意味着你不能使用ajax在javascript中编写一个很好的结构化程序。一切都必须有回调 – gong 2011-03-14 12:48:29
或者使用同步的XmlHttpRequest。 “AJAX”是一个用词不当。来自jquery文档的 – 2011-03-14 12:49:58
:跨域请求和dataType:“jsonp”请求不支持同步操作。请注意,同步请求可能会暂时锁定浏览器,并在请求处于活动状态时禁用任何操作。 – gong 2011-03-14 12:53:28
要以异步方式从urllink获取数据,并在返回data.result所在的函数是一个回调函数,当调用URL完成将被调用。
后续代码不会等待异步调用完成。
附加了哪个调试器? – 2011-03-14 12:35:12
请使用预览窗格,并在将来正确设置您的文章的格式。另外,我建议你用'if'语句为便携性使用大括号('if(data == null){alert('null');}')。 – 2011-03-14 12:49:09