2008-05-01
静的HTMLで、インクルードを実現するためのJavaScript
HTML, Javascript |
ローカルディスク上に存在する静的HTMLで、外部ファイルをインクルードするためのスクリプト(つまり、XMLHttpRequestオブジェクトの代わり)。
以前にも同じようなエントリを書いたのですが(http://d.hatena.ne.jp/kenpoco/20080228/1204198090)、いくつか不具合があったので修正してます。
- IE6,7に対応(前回はFirefox2のみ)。
- インクルードするファイルの拡張子が.HTMLと.TXTで動作が異なっていたので、その対応。
- インクルードした後で、その内容を変更するための仕組みを追加。
最近HTMLを作る機会が多いので自分で使ってみてるのですが、けっこう重宝してます。全ページに同じようなヘッダー部分がある場合なんかに、ヘッダー部分を1ファイルにまとめておけるので、その後の修正がかなり楽。
【使用例】 ----------------------- インクルード部分 ----------------------- <div> <script type="text/javascript" > include("a.html"); ←HTML内のインクルードしたいところに記入 </script> </div> ----------------------- インクルードされるファイル(a.html) ----------------------- <div style="border: solid 1px #000000;">hello;</div> ----------------------- インクルード結果(表示後にinnerHTMLで確認) ----------------------- <div> <script type="text/javascript" > </script> <div style="border: solid 1px #000000;">hello;</div> ←includeした内容が<script>タグの下のところに入る </div>
【関数本体】 ----------------------- function include(filename, afterfunc) { include.seq = (include.seq)? include.seq + 1: 1; var id = new Date().getTime() + "-" + include.seq; var inc = document.createElement("iframe"); inc.id = "inc-" + id; inc.src = filename; inc.style.display = "none"; document.write("<span id=\"" + id + "\"></span>"); var incfunc = function() { var s = (function() { var suffix = (n = filename.lastIndexOf(".")) >= 0 ? filename.substring(n): "default"; if (suffix == ".html") return inc.contentWindow.document.body.innerHTML; if (suffix == ".txt") return inc.contentWindow.document.body.firstChild.innerHTML; if (suffix == "default") return inc.contentWindow.document.body.innerHTML; })(); var span = document.getElementById(id); var insertBeforeHTML = function(htmlStr, refNode) { if (document.createRange) { var range = document.createRange(); range.setStartBefore(refNode); refNode.parentNode.insertBefore(range.createContextualFragment(htmlStr), refNode); } else { refNode.insertAdjacentHTML('BeforeBegin', htmlStr); } }; insertBeforeHTML(s.split(">").join(">").split("<").join("<"), span); document.body.removeChild(inc); span.parentNode.removeChild(span); if (afterfunc) afterfunc(); }; if (window.attachEvent) { window.attachEvent('onload', function() { document.body.appendChild(inc); inc.onreadystatechange = function() { if (this.readyState == "complete") incfunc(); }; }); } else { document.body.appendChild(inc); inc.onload = incfunc; } }
- 6 http://discypus.jp/wiki/?ソフト/Bug Tracking/trac/未整理2008
- 3 http://www.google.co.jp/search?q=java+The+return+type+is+incompatible+with+JspSourceDependent.getDependants()&hl=ja&lr=lang_ja&sa=X&oi=lrtip&ct=restrict&cad=8
- 3 http://www.google.co.jp/search?sourceid=navclient&aq=t&hl=ja&ie=UTF-8&rlz=1T4GGLJ_jaJP236JP236&q=CREATE+TABLE+select
- 3 http://www.google.com/search?hl=ja&lr=lang_ja&ie=UTF-8&oe=UTF-8&q=rtexprvalue&num=50
- 2 http://www.google.co.jp/search?hl=ja&q=PLS-00231&btnG=Google+検索&lr=lang_ja
- 2 http://www.google.co.jp/search?hl=ja&q=java+JspSourceDependent.getDependants()&btnG=検索&lr=lang_ja
- 2 http://www.google.co.jp/search?hl=ja&q=pls-00231&lr=
- 2 http://www.google.co.jp/search?hl=ja&q=plsql+BULK+COLLECT+INTO+ループ&lr=
- 2 http://www.google.co.jp/search?hl=ja&rlz=1G1GGLQ_JAJP271&q=HSSFWorkbook+cloneSheet+セル 結合&lr=
- 2 http://www.google.co.jp/search?q=PL/SQL+コーディング&hl=ja&lr=&rlz=1T4DBJP_jaJP273JP273&start=10&sa=N
user 2009/07/29 10:16 ありがとうございます!
とっても便利です。使用させていただきます
yahoo 2009/08/26 17:49 とても便利なのですが、こちらieで確認すると表示されますが、firefox3で確認するとインクルード部分表示されません。
そういうものでしょうか?
ゆきこ 2009/10/05 15:12 大変便利に使わせていただいております。
しかしながら、オペラでは見られないみたいで・・・。何か対応があれば教えていただけると助かります。あつかましいおねがいで失礼致します。
zeroxone 2009/10/29 10:20 IE7で拡張子がtxtだとソースの一部分(最初の方だけ。削除すると下も表示される)しか表示されません。しかし拡張子をhtmlに変えたら問題なく表示されました。これって何が違うのでしょう?
firefoxはOKでした。
ぼん 2009/11/29 22:45 使わせてもらってます。ありがとうございます。js でできるんですね。
ただinclude2か所試しましたが、1か所は反映されませんでした。
2か所は無理なんでしょうか?
ぶるる 2009/12/16 04:30 使わせていただてなんですが、firefox3.5だとまるっきり映りません。35行目にエラーと出ます。document.body.removeChild(inc); このあたりだと思うのですが。
老婆心 2010/09/04 21:53 include される HTML 内に、form の action が、あると、button の submit も、機能しないのは、何故でしょうか?