最近、 script
要素を使って、 HTML 文書中にスクリプト処理用の不可視データを埋め込むことが正式に認められるようになりました*1 。これを使うと、別の HTML 文書さえ、
<script type="text/html">
<!DOCTYPE HTML>
...
</script>
のように埋め込めるようになります。ではここで問題というかクイズというか頭の体操なのですが、これを二重に (入れ子に) 使うことはできるでしょうか。つまり、 script
要素を使って HTML 文書を埋め込んだ HTML 文書を更に別の HTML 文書に script
要素を使って埋め込むことはできるのでしょうか? イメージとしては、
<!DOCTYPE HTML>
<title>1番目の HTML 文書</title>
<script type="text/html">
<!DOCTYPE HTML>
<title>2番目の HTML 文書</title>
<script type="text/html">
<!DOCTYPE HTML>
<title>3番目の HTML 文書</title>
<p>3番目の HTML 文書
</script>
<p>2番目の HTML 文書
</script>
<p>1番目の HTML 文書
のような感じです。ただし、このままでは、最初の </script
タグのところで2番目の HTML 文書が終わるとみなされてしまいます。この問題を解くに当たっての条件は、 (1) JavaScript などの本当のスクリプトを実行しないこと、 (2) 適合 HTML5 文書であること、の2つだけです。でも (2) はここではあまり本質的ではないので気にしなくてもおkです。
ヒント: <script>
開始タグの後では、普通は </script
という文字列があると要素を閉じてしまうのですが、例外的に、 <!--
という文字列があると、次の -->
という文字列まで、終了タグを認知しません*2 。
これができたから何かの役に立つということはないでしょうけれども、お暇な方は考えてみてください。
気が向いたら答えを発表します。
三重 (二重埋め込み) ができたら、もう1回入れ子にして、四重 (三重埋め込み) の方法を考えてみてください。もしできないなら、できないことを証明してみてください。
相対 URL の取扱いは、歴史的に仕様も二転三転して実装もばらばら、 Web 関連技術の中でもかなりカオスなものの1つです。
残念なことに JavaScript や DOM で相対 URL を解決する API は提供されていないのですが、 a
要素の href
DOM 属性は href
内容属性の値 (URL) を解決したものを返すことになっていますので、これと base
要素を組み合わせると、相対 URL を解決したものをスクリプトから取得できます。
これを使って遊んでみようということで、 Live URL Resolution Viewer を作りました。解決させたい相対 URL と基底 URL を指定すると、解決された URL が出てきます。
試しに、基底 URL として mailto:a@b.c#d
、解決させる URL として e
を指定してみましょう。こんな結果が得られたはずです。
e
(基底 URL が階層的な URL ではないので、 HTMLAnchorElement.href
が相対 URL をそのまま返しています。)mailto:a@b.ce
(基底 URL にあった素片識別子は除去されます。相対 URL が基底 URL になぜか連結されます。)HTMLAnchorElement.href
が空文字列を返しています。)mailto:/e
(なぜか /
が補われています。)mailto:
URL なんて基底 URL に使わないので実害はないですが。いろいろな URL を指定して試してみるとわかりますが、どのブラウザでも共通した同じ結果が得られるのは、ごく限られた種類の URL の組み合わせのときだけです。