JQuery を使用して、複数の静的 HTML ファイルから HTML ページを作成しています。メインの html ファイルには、次のように、header.html と footer.html のプレース ホルダーがあります。
<!DOCTYPE html>
<html>
<head>
<title>Bootstrap 101 Template</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- Bootstrap -->
<link href="bootstrap/css/bootstrap.min.css" rel="stylesheet" media="screen">
</head>
<body>
<div class="place-holder" include-file="bbheader.html"></div>
</html>
ファイル bbheader.html には、実行時に追加の HTML コンテンツをロードするための独自のプレースホルダーが含まれています。
bbheader.html の内容
<div class="nav navbar">
<p> Hello I am bbheader. Thanks for loading me!</p>
<div class='place-holder' include-file='bbfooter.html'></div>
</div>
これらのファイルをロードするために、以下のように JQuery スクリプトを使用しています。
$(function () {
loadRecursive($(this));
});
function loadRecursive(context) {
//search matching elements that have 'place-holder' class
$('.place-holder', context).each(function() {
$.get($(this).attr('include-file'), function(data, textStatus) {
$(this).replaceWith(data);
loadRecursive($(this));
}, 'html');
});
}
JQuery.load を使用する代わりに、get を使用しています。これは、load 呼び出しにより、フェッチされたコンテンツが div コンテキストの子として追加されるためです。私が望んでいたのは、プレースホルダー div を完全に置き換えて、取得したコンテンツに置き換えることでした。したがって、get() と replaceWith() を使用しています。
しかし、この行「$(this).replaceWith(data);」で正しい div コンテキストを取得していないため、関数は置換に失敗しています。$(this) は置き換えたい div であると予想していましたが、ここで「this」はコンテンツを取得するために JQuery によって構築されたオブジェクトを指しているようです。
私は JQuery の初心者で、これを正しく行うことができません。これを行うためのより良い/代替方法はありますか?
ありがとう..
更新: Leonard の提案に従って試してみましたが、これが新しいコードです:
function loadRecursive(context) {
//search matching elements that have 'place-holder' class
$('.place-holder', context).each(function() {
var that = this;
$.get($(this).attr('include-file'), function(data, textStatus) {
$(that).replaceWith(data);
loadRecursive(that);
}, 'html');
});
}
ただし、これは 1 レベルでのみ機能します。replace?With() を実行した後、再帰に移行すると、loadRecursive の 2 回目の呼び出しで、変更された「自己」が取得されません。
期待される:
<div class="nav navbar">
<p> Hello I am bbheader. Thanks for loading me!</p>
<div class='place-holder' include-file='bbfooter.html'></div>
</div>
しかし、それはまだ持っています
(<div class="place-holder" include-file="bbheader.html"></div>
何か不足していますか?
編集:
ありがとうレナード!次の変更で動作します。
function loadRecursive(context) {
//search matching elements that have 'place-holder' class
$('.place-holder', context).each(function() {
var that = $(this);
$.get(that.attr('include-file'), function(data, textStatus) {
repl = $(data);
that.replaceWith(repl);
loadRecursive(repl);
}, 'html');
});
}