本当に個別にロードしたい場合は、まさにそれがjQueryのload
目的です。たとえば、data-page
これらの要素に属性を設定して、各要素にどのコンテンツを含めるべきかを指示するとします。
<div class="panel" data-page="page1.html">Panel 1</div>
<div class="panel" data-page="page2.html">Panel 2</div>
<div class="panel" data-page="page3.html">Panel 3</div>
<div class="panel" data-page="page4.html">Panel 4</div>
(あなたはそれをする必要はありません、それはあなたが彼らに言うかもしれないただ一つの方法です。)
次に、それらを順番にロードする(本当に順番にしたい場合)のはかなり簡単です。
// Assumes script is at the bottom of the page, just before </body>
(function() {
var index = 0,
panels = $(".panel");
triggerLoad();
function triggerLoad() {
var panel;
if (index <= panels.length) {
panel = $(panels[index]);
++index;
panel.load(panel.attr("data-page"), triggerLoad);
}
}
})();
これは、ページが最初にレンダリングされたときに最初のパネルのロードをトリガーし、次に前のload
呼び出しの完了ハンドラーを使用して後続の各パネルのロードをトリガーすることで機能します。
実例| ソース
以下のコメントでは、画像などが完了するのを待つことについても話しました。body
Windowsで取得するマスターの要素がonload
ないため、不完全な画像(プロパティHTMLImageElement
があるcomplete
)をチェックして、それらのロードイベントをフックする必要があります。不完全な画像がなくなったら、次のパネルをロードします。
(function() {
var index = 0,
panels = $(".panel");
nextPanel();
function nextPanel() {
var panel, imgs;
display("Checking for panel #" + index);
panel = panels[index++];
if (panel) {
panel = $(panel);
display("Loading panel");
panel.load(panel.attr("data-page"), panelLoaded);
}
function panelLoaded() {
display("Panel loaded");
imgs = panel.find('img');
imgs.on('load', nextPanelWhenReady);
nextPanelWhenReady();
}
function nextPanelWhenReady() {
var incomplete = imgs.filter(onlyIncomplete);
if (incomplete.length === 0) {
display("No pending images, loading next panel");
imgs.off('load');
nextPanel();
}
else {
display("Images left to load: " + incomplete.length);
}
}
function onlyIncomplete() {
return !this.complete;
}
}
function display(msg) {
$("<p>").html(String(msg)).appendTo(document.body);
}
})();
実例| ソース
これは画像のみを処理しますが、ビデオの概念も一般化できるはずです(タグについては扱ってvideo
いません。また、Flashビデオなどとは対照的にタグを使用していることもわかりません。また、扱っていません)。