記事本文
そもそも発想の順番が違うような……
はてなブックマーク - 最近の人気エントリー経由で [戯] target="_blank" を使わないで新しいウィンドウでリンクを開く方法と hori-uchi.com: _blankを使わないで別ウィンドウを開くにはrel="external"を使うのが美しいと思う。
window.open
を使った前者はともかく ( これはこれでバッドノウハウな気がしますけど ) 、後者は HTML ソース中に記述していないだけで、結局は
target="_blank"
を使っていることと同じなんじゃないのかなあ、と思いました。
コメント欄での
内部的に展開されるDOMツリーはXHTML 1.1 や XHTML Basicに準拠していないんじゃないでしょうか
という指摘や、はてなブックマークのコメントの
rel属性は当該リソースとhrefで示されたURIとの関係なわけで、アプリケーションの挙動を示す為の手段として使うべきではないでしょう
という指摘に私は頷きました。
JavaScript を使って解決するよりも、 target 属性を使って、 Transitional DTD を宣言するのが最もスマートな解だと思います。 ( ウィンドウの挙動を target 属性で制御すること自体の是非はここでは置いておいて。 )
何故順番が違うというのか
それぞれの記事中ですごく気になったのが、
<a href="foo.html" target="_blank">foo</a>を使えば新しいウィンドウでリンクが開きますが,これは XHTML 1.1 や XHTML Basic では採用されていません. ではどうするかというと,スクリプトを使うわけですが,
や
target="_blank"という書き方がXHTML 1.1 や XHTML Basicに準拠していないので、これらに準拠するようにしつつ、別ウィンドウで開くにはどうすればよいかという話です。
といった記述。 そもそも XHTML 1.1 や XHTML Basic において、ウィンドウをどのように開くかの挙動を指定する target 属性は定義されていないのですから、そのような結果を求めつつ XHTML 1.1 や XHTML Basic を宣言しようとするのが間違いではないでしょうか、と思います。
DTD をどのように宣言するかを考える際に、文書型宣言についてという記事が参考になるのですが、冒頭に
ある文書のマーク附けが完了した時、その文書がHTMLの仕様書(DTD:Document Type Definition:文書型定義)に照らして正当であったとします。 その時、あなたはその文書の先頭に文書型宣言を記述できます。
と書かれてあります。 すなわち、
- XHTML 1.1 ( または XHTML Basic ) を宣言する
- マークアップしていく途中で、別ウィンドウでリンクを開きたい箇所が出てくる
- XHTML 1.1 や XHTML Basic では target 属性は定義されていない、どうしよう
- JavaScript でどうにかしよう
というのは順番としては誤りで、
- マークアップしていく途中で、別ウィンドウでリンクを開きたい箇所が出てくる
- target 属性を使って、別ウィンドウでリンクを開くようにマークアップ
- target 属性を使った文書が適合する DTD を考えると、 Transitional DTD のみである
- Transitional DTD を宣言する
という考え方をするのが良いと思います。 実際は宣言する DTD を決めてからマークアップをするという順番も充分に考えられます ( 私が Movable Type のテンプレートを書く時もその順番です ) が、考え方としては DTD の宣言は最後に行うとした方が良いと思います。
Firefox で防げるのかなあ
私は自分の意思でそうしたい時以外に別ウィンドウ ( あるいは別タブ ) でリンクを開かれるのを非常に嫌うのですが、これらの
window.open
によるリンクや、後付けな
target="_blank"
によるリンクも Destroy target="_blank" with Firefox 1.5 の方法で防げるのかな、とふと思いました。
サンプルを作って試す気が起きないので、誰か検証してください。 ( 他力本願 )

