load()顺序,而不是同时与jQuery
问题描述:
我正在开发一个网站,我想要从导航栏中获取所有链接,并将链接页面中的div加载到大容器中。我至今如下:load()顺序,而不是同时与jQuery
$('nav a').each(function(index){
var to_load = $(this).attr('href') + '#slides section';
$('<section>').load(to_load, function(){
$('#slides').append($(this).html());
});
});
这个伟大的工程,除了因为它几乎是送花儿给人失灵,可能是由于异步加载它。有没有办法一次加载每一个,所以这些部分将按顺序排列,同时仍然保持灵活性?
感谢堆提前!
答
我想用async: false
提及jQuery.ajax documentation。 不知道它是否适用于load
,但我敢打赌它的确如此。
而且,出于性能原因,不要使用:
$(this).attr('href') + '#slides section'
但
this.href + '#slides section'
为了避免转换成this
一个jQuery元素(你只需要它来获得href
属性)。
答
var loadTos = [];
$('nav a').each(function(index){
loadTos.append($(this).attr('href') + '#slides section');
});
function load_link(to_load) {
$('<section>').load(to_load, function(){
$('#slides').append($(this).html());
loadTos.length && load_link(loadTos.pop());
});
}
if(loadTos.length) {
loadTos = loadTos.reverse(); // make getting urls from first to last
load_link(loadTos.pop());
}
此代码会按时间顺序加载网址。他们将被逐一加载。
答
async: false
可能是一种选择,如@marcosfromero
提到您不妨尝试一前一后呼叫负载的另一种选择完成(当然,这看起来很像async:false
)
var i = -1; // this is because we will increment the value before using it
var collection = $('nav a');
function loadNext() {
i++;
if (i < collection.length) {
var to_load = $(collection[i]).attr('href') + '#slides section';
$('<section>').load(to_load, function(){
$('#slides').append($(this).html());
loadNext();
});
}
}
loadNext();
答
您创建一个递归函数,只要.load
完成其自称,从而保证顺序:
// grab array of links
var links = $('nav a').map(function() {
return this.href;
}).get();
function loadSlides() {
$('<section>').load(links[0] + '#slides section', function() {
$('#slides').append($(this).html());
// remove first item of links array
links.shift();
loadSlides();
});
}
loadSlides();
那精美的作品。我只是在上面的代码之前查找'.ajaxSetup({async:false});'它工作了(并且还修复了我遇到的另一个问题) – 2011-06-06 11:30:19