SSブログ

ローカルでHTMLにHTMLをインクルード [日記]

HTMLファイルの中に、別にファイルに記述されたHTMLを埋め込みたいのです。

SSIでは、こんな感じ。

<!--#include file="~" -->

JSPでは、こんな感じ。

<%@ include file="~" %> 

これと同じことを、サーバを使わず、ローカル環境のみで行いたいのです。
javascriptを使って。


HTMLの文字列が取得できれば、以下の様なコードで埋め込むことは出来ます。

<script type="text/javascript">
<!--
var str = ~;	// 埋め込むHTML
document.getElementById("target").innerHTML = str;
// -->
</script>

<div id="target">
<!-- ここに他のHTMLが埋め込まれる -->
</div>

後はファイルからデータを読み込めればOKっぽいです。


ファイルからテキストをロードするには、IEならFileSystemObjectが使えます。

var fso = new ActiveXObject("Scripting.FileSystemObject");
var f = fso.OpenTextFile("~~", 1);
var str = f.ReadAll();
f.Close();

IE以外なら(と言うか、ActiveXが使えない環境なら)、AJAX風にすることで実現できます。

var httpObj = new XMLHttpRequest();
httpObj.onload = funcLoaded;
httpObj.open("GET", "~~", true);
httpObj.send(null);

function funcLoaded()
{
    str = httpObj.responseText;    // ← ファイルの中身
}

ところが、XMLHttpRequestは文字コードとしてUTF-8しか使えません。
出来ればShift-JISで書かれたファイルを読み込みたいのです。

そこで、こんな手を考え付きました。

まず、読み込みたい別ファイルのHTMLのタグにid属性として"main"を指定しておきます。

<body id="main">
ここが読み込まれるHTML
</body>

そして次のJavascriptコードを実行します。

var tempWin = window.open("~~", "tempWin");
var str = tempWin.document.getElementById("main").innerHTML;  // ← ファイルの中身
tempWin.close();

ウィンドウが一瞬開いて閉じるため鬱陶しいのですが、コレには理由があります。

HTMLの読み込みが全て完了したかどうかを検知する方法が、OnLoadイベントしかないのです。
読み込み完了をきちんと判定しないと、大きなHTMLファイルを読み込もうとした場合、途中までしか取得できません。

どうせid属性を書かなければならないのですから、もう1つくらい余分に書くくらい、何でもありません。

// 読み込まれるファイル
<body id="main" onload="opener.callbackOnLoad()">
ここが読み込まれるHTML
</body>
// 呼び出す方
var tempWin = window.open("~~", "tempWin");

function callbackOnLoad()
{
    var str = tempWin.document.getElementById("main").innerHTML;  // ← ファイルの中身
    tempWin.close();
}

そんなわけで、別のHTMLファイルの中身を埋め込むことが出来ました。
(読み込もうとするHTMLファイルの指定を間違えると、ブラウザの画面が開いたままになりますが……)

でも、一番真っ当な方法は、やはり XMLHttpRequestを使う方法だと思いました。

[飛行機] 今日の一冊
脳男

脳男

  • 作者: 首藤 瓜於
  • 出版社/メーカー: 講談社
  • 発売日: 2000/09
  • メディア: 単行本


タグ:JavaScript
nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。