初めてs3環境使ったけどphpもssiも使えないんだね。
phpインクルードでヘッダー・フッターのhtmlを共通化してたもんだから、javascriptで共通化することにしました。
document.write()でやってみたら、html全体が出力内容になってしまったので$.ajaxでhtmlを読み込んでinsertAdjacentHTML()で出力する方法でやりました。
関数用意して、挿入したい場所で
<script>inc_header();</script>
で呼び出します。
function inc_header(){
$.ajax({
url: "/include/inc_header.html",
cache: false,
success: function(html){
document.querySelector('.l-container').insertAdjacentHTML('afterbegin', html);
}
});
}
function inc_footer(){
$.ajax({
url: "/include/inc_footer.html",
cache: false,
success: function(html){
document.querySelector('.l-container').insertAdjacentHTML('beforeend', html);
}
});
}
insertAdjacentHTMLで任意の場所に挿入する
inserrtAdjacentHTMLは、positionを指定して任意の場所に挿入できます。
element.insertAdjacentHTML(position, html);
追加場所のpositionは、
position | 場所 | jqueryの場合 |
beforebegin | 要素自身の前 | before() |
afterbegin | 要素内の最初の子要素の前 | prepend() |
beforeend | 要素内の最後の子要素の後 | append() |
afterend | 要素自身の後 | after() |
phpもssiも使えない案件、たまにあるからそんな時はjavascriptで共通化インクルードですね。
インクルードした要素にjsで制御する要素があると挙動不審
ただし、javascriptのインクルードでは問題があります。
インクルードした要素にjsで制御する要素があると読み込みのタイムラグがあるため、挙動があやしくなります。
例えば、ヘッダーをインクルードしていて設置したハンバーガーメニューが開いたり開かなかったり。。。これは、ハンバーガーメニューのクリックイベントの設定が実行された後にhtml要素がjsで読み込まれてしまうためと考えられます。
解決策としては、インクルードするhtmlファイルにjs処理も記述してしまえばよいでしょう。
コメント