target="_blank" を使わないで新しいウィンドウでリンクを開く方法

comments(10) | trackback(5)

はてなブックマークに追加 はてなブックマーク数 del.icio.us に追加 livedoor クリップに追加 livedoor クリップ数 Yahoo!ブックマークに追加

<a href="foo.html" target="_blank">foo</a>


  を使えば新しいウィンドウでリンクが開きますが,これは XHTML 1.1 や XHTML Basic では採用されていません.
  ではどうするかというと,スクリプトを使うわけですが,

<a href="javascript:void(0)" onclick="window.open('foo.html');">foo</a>


  こうすると,一見解決したようですが,JavaScript が off の場合はリンク先に飛べません.
  しかも,ステータスバーにリンク先が出ないので不安になります.これを

<a href="foo.html" onclick="window.open('foo.html'); return false;">foo</a>


  とすれば,ステータスバーにリンク先が表示されるし,JavaScript が off でもリンク先に飛ぶことができます.

  ここまでは,AllAbout の受け売りなんですが,いちいちリンク先全部に onclick をつけるのは面倒です.
  しかも,onclick だけではなく onkeypress もつける必要があります.

  これを解決するのが以下のスクリプト.prototype.js 必須.

var PopupWindow = Class.create();
PopupWindow.prototype = {
    initialize: function(className, parentElement) {
        var elements = document.getElementsByClassName(className, parentElement);
        for (var i = 0, len = elements.length; i < len; i++) {
            Event.observe(elements[i], 'click', this.addPopupEvent.bindAsEventListener(this));
            Event.observe(elements[i], 'keypress', this.addPopupEvent.bindAsEventListener(this));
        }
    },
    addPopupEvent: function(event) {
        var element = Event.element(event);
        var link = element.getAttribute('href');
        window.open(link);
        Event.stop(event);
    }
};


  まず,getElementsByClassName() で指定した class を持つ要素を列挙します.それぞれの要素に対して
  click イベントと keypress イベントをバインドしています.

  イベントが発生すると,発生した要素の href 属性を取得して window.open() に渡してあげます.
  本来のイベントは止める必要があるので,Event.stop() しています.

使い方

Event.observe(window, 'load', function () {
    new PopupWindow('popup');
});

<a class="popup" href="foo.html">foo</a>


  この場合は class に popup を指定した a タグが全て別ウィンドウで開きます.class 名は自由に設定できますし,
  親エレメントを指定したければ,prototype.js の document.getElementsByClassName() に引数を渡しているだけなので

Event.observe(window, 'load', function () {
    new PopupWindow('popup', 'p');
});


  のように指定することも可能です.

  以上で,JavaScript が off の場合も同じウィンドウですがリンク先は開けますし,on の場合は別ウィンドウで開くことができます.
  また,いちいち onclick や onkeypress を html 内に記述する必要もありませんので,お手軽に利用することができます.
  そして,ステータスバーにリンク先が表示されるので利用者に不安を与えません.

- ref.: スクリプト OFF でもちゃんと閲覧できるように サブウインドウを開く弊害と対策
  http://allabout.co.jp/computer/hpcreate/closeup/CU20040118A/

注意

  本記事は,別ウィンドウで開くことを推奨しているわけではありません.別ウィンドウで開くことの是非とはまた別のお話です.
  XHTML 1.1 に準拠しながらも,別ウィンドウで開かざるを得ない状況と考えてください.

- ユニバーサルHTML/XHTML
  4839904545
  amazon.co.jp 詳細ページへ
  神崎 正英 (著)
  毎日コミュニケーションズ
  ISBN: 4839904545
  2000/11
  2,310 円

- 詳解 HTML & XHTML & CSS 辞典
  4798010030
  amazon.co.jp 詳細ページへ
  大藤 幹 (著)
  秀和システム
  ISBN: 4798010030
  2005/01
  1,890 円

タグ: [JavaScript]

この記事へのコメント

behaviour.js を利用すると楽に実装できました。

http://memo.xight.org/2006-03-15-1

rel="external" の記述も気になります。
http://hori-uchi.com/archives/000424.html

Yoshiki | 2006/03/15 (Wed) 14:42:58

すみません。

>しかも,onclick だけではなく onkeypress もつける必要があります.

これはどうしてですか?ちょっと補足してもらえないでしょうか?
allaboutの記事ではonkeypressについての記述はありませんでした。

tocks | 2006/03/15 (Wed) 17:40:55

> Yoshiki
おお,behaviour.js は知りませんでしたよ.
ただ,見せてもらったサンプルだと,ポップアップ元?のページもポップアップ先のページが開いてしまうね.
本来のイベントを止める方法はあるのかしら?

すなおか | 2006/03/15 (Wed) 18:47:07

> tocks さん
はじめまして.
装置に依存しないように,

onmousedown と onkeydown,
onmouseup と onkeyup,
onclick と onkeypress

はいっしょに使いましょう,というアクセシビリティの指針に記載されています.

http://www.w3.org/TR/WCAG10-HTML-TECHS/#directly-accessible-scripts

すなおか | 2006/03/15 (Wed) 18:56:07

あまり知られてないけど、、、XML要素だけの世界で表現するなら:
<a href="hoge" xlink:show="new">...</a>
とかも!?

masao | 2006/03/16 (Thu) 00:27:07

>> tocksさん

onclickだけに処理を書いたリンクにTabキーを使って移動し、Enterキーを押してみてください。正常に動作しません。
onclickに書いた処理はonkeypressにも書かないと、こういったバグにつながります。

通りすがりの倉庫キャラ | 2006/03/16 (Thu) 10:08:48

> masao さま
なるほど,そういう表現もあるのですね.

> 通りすがりの倉庫キャラさま
補足ありがとうございました.

すなおか | 2006/03/17 (Fri) 09:01:45

使わしていただきました。
かなりソースが綺麗になります。

ただ、imgをはさむとimgのsrcをどうやら取得してしまうみたいです。
解決方法はありませんか?

名無し | 2006/07/20 (Thu) 19:14:52

使わせていただきます。便利ですね。ありがとうございます。

sbs_ts | 2008/02/09 (Sat) 08:20:00

macのsafariとffで動きませんでした。なんででしょう?

azator | 2008/05/22 (Thu) 13:39:59

この記事へのコメントを書く

名前:

メールアドレス (公開されません):

URL:

コメント (入力必須)

この記事へのトラックバック URL

http://cl.pocari.org/tb.php/2006-03-14-5

この記事へのトラックバック

_blankを使わないで別ウィンドウを開くにはrel="external"を使うのが美しいと思う。

はてなブックマークをみていたら、気になるエントリーを発見。 [戯] target="_blank" を使わないで新しいウィンドウでリンクを開く方法 target="_blank"という書き方がXHTML 1.1 や XH...

hori-uchi.com | 2006/03/15 (Wed) 14:03:04

target="_blank"を使わないで新しいウィンドウでリンクを開く方法

target="_blank"を使わないで新しいウィンドウでリンクを開く方法

アフィリエイトやSEOで稼ぐマネー道場 | 2006/03/16 (Thu) 10:52:03

[javascript] target 属性を無効にする例のあれ R

なにげにリファを覗いていたら、 target 属性を無効にする例のあれを、引用しているところがいくつかあるようで。 あれは全然未完成で、場所によってはおかしな挙動をするところも少なくないと思うんで、そのまま使い続けるのはいかがなもんでしょう?そんなわけで、...

USOperaION/ε∂.∂з\ | 2006/03/23 (Thu) 22:55:16

targetを使わないで新しいウインドウを開く

昔はよくリンク先を新しいウインドウを開くのにtarget属性なんかが使われていた...

アキラ's ITメモ | 2007/01/07 (Sun) 16:21:05

target=_blankの代替手段2

[ target=_blankの代替手段 ]への追記です。とても便利なエントリを発見。こちらソースがとてもすっきりします。サンプル:click!...

not losing to the rain | 2008/02/09 (Sat) 11:18:48