javascriptでphpのincludeみたいな事をしてみる

Pocket

システム部の鈴木です。
年度末で弊社も大忙しですが、小ネタを一つ。

phpとかですと共通のヘッダやフッタなどを共通化するというのは良くありますが、
それをJavaScriptでやってみたいと思います。

仕様

  • 共通ファイルのhtmlを作成、部品毎に<!–inc_****–><!–/inc_****–>で囲んでおく
  • ajaxで共通ファイルをロード
  • 読み取る側のhtmlでは、<!–inc_****–><!–/inc_****–> の **** 部分を指定して表示

共通ファイルのhtml

例えば幾つかのリストがあって、複数のページで使いまわしたいとします。
それを共通のファイルにぶちこんでおきます。

<br />
&lt;!&#8211;inc_lsit1&#8211;&gt;<br />
  &lt;ul&gt;<br />
    &lt;li&gt;てすと1&lt;/li&gt;<br />
    &lt;li&gt;てすと1&lt;/li&gt;<br />
  &lt;/ul&gt;<br />
&lt;!&#8211;/inc_lsit1&#8211;&gt;<br />
&lt;!&#8211;inc_lsit2&#8211;&gt;<br />
  &lt;ul&gt;<br />
    &lt;li&gt;てすと2&lt;/li&gt;<br />
    &lt;li&gt;てすと2&lt;/li&gt;<br />
  &lt;/ul&gt;<br />
&lt;!&#8211;/inc_lsit2&#8211;&gt;<br />

javascript

include.js とかで保存しときます
共通ファイルのURLは今回は決め打ちですが、共通ファイルが多様でない想定のものなので決め打ちで。

<br />
$(function(){<br />
  var tmp = $.ajax({<br />
    url: &#8216;/path/to/include.html&#8217;,<br />
    cache: false,<br />
    async: false<br />
  }).responseText;</p>
<p>  var target = $(&#8216;[id^=inc_]&#8217;);</p>
<p>  jQuery.each(target, function() {<br />
    var include = $(this).attr(&#8216;id&#8217;);<br />
    var reg = new RegExp(&#8216;&lt;\!&#8211;&#8216;+include+&#8217;&#8211;&gt;([\n\r]|.)*&lt;\!&#8211;\/&#8217;+include+&#8217;&#8211;&gt;&#8217;);<br />
    var html = tmp.match(reg);<br />
    $(this).html(html[0].replace(reg, &#8221;));<br />
  });<br />
});<br />

読み取る側のhtml

include.js をロードし、読み取りたい部分をidで指定します
以下の例では共通ファイルから<!–inc_list1–><!–/inc_list1–>の範囲だけを抜き出して表示させます

<br />
&lt;script src=&quot;include.js&quot;&gt;&lt;/script&gt;<br />
&lt;div id=&quot;list1&quot;&gt;&lt;/div&gt;<br />

以上です。

今回のように特定のタグ~特定のタグのような範囲を抜く場合は最短マッチを使います。
さらに今回は複数行にマッチさせています。
加えてマッチさせる条件に変数を使いたいので RegExp オブジェクトでパターンを作成してます。
該当部分はここですね。

<br />
    var reg = new RegExp(&#8216;&lt;\!&#8211;&#8216;+include+&#8217;&#8211;&gt;([\n\r]|.)*&lt;\!&#8211;\/&#8217;+include+&#8217;&#8211;&gt;&#8217;);<br />
    var html = tmp.match(reg);<br />

また読み込む側のページで何箇所か抜き出したい、今回の例ならlist1もlist2も表示させたい場合もあると思うので
そのために $(‘[id^=inc_]’) でページ内の表示させたい部分をまとめて拾って、jQuery.each() で順に処理させてます。

いわゆる共通化が目的ならphpが使えればもちろんその方が簡単なのですが、
staticページで作っててmod_rewriteも使えないなど制約があるときにはこんな方法もあります、という小ネタでした。

またはちょっとしたスクレイピングをささっとやりたい場合に使えるかもしれないですね。