jQueryでtarget属性を使わずに外部リンクを別窓表示

2007年1月25日

今回はjQueryを使ってtarget要素を使わずに外部リンクを新しいウィンドウで開くようにしてみます。
XHTML1.0strictとXHTML1.1ではtarget要素がなくなりました。XHTML1.0TransitionalとFramesetでは定義はされていますが、「非推奨要素」とされています。そうは言っても、外部リンクを新しいウィンドウで開きたい場合は多々あるかと思います。(クライアントからどうしても別窓でと頼まれたり・・・)そんな時にこのTipsは大いに使えると思います。

今回はJavaScriptのwindow.open()を使います。普通に使うなら下記のように書きます。

window.open(飛び先のURL, '_blank')

外部リンクだけを新しいウィンドウで開きたいので、属性セレクタを指定して下記のように書きます。[@href^=”"]と書いてある部分はXPathの指定方法に基づきます。

$(document).ready( function () {
	$('a[@href^="http://"]').click(function(){
	window.open(this.href, '_blank');
	return false;
	});
});

これで通常のサイトなら上記のコードで外部リンク(http://~からはじまるもの)は新しいウィンドウで開くようになります。ところがMovableTypeだと内部リンクも絶対URLで書いてあるため、このままでは不都合が生じてしまいます。

MovableType用にコードを書き換える

上記のjQueryのコードをMovableType用に書き換えてみます。
jQueryにはフィルターというものがあります。特定のDOM要素を抜き出し、さらにフィルターで要素を絞ることができます。ここではそのフィルターを使い要素を絞ってみます。

$('a[@href^="http"]').not('[@href^="自分のサイトのURL"]')

not以下がフィルターとして追加した部分です。href=httpという属性をもつ<a>要素のうち、not以下で自分のサイトURLを指定してあるものを除外しています。”自分のサイトのURL”の部分にご自身のサイトのURLを入れて下さい。最終的なjQueryのコードは下記のようになります。

$(document).ready( function () {
	$('a[@href^="http"]').not('[@href^="http://www.lllcolor.com"]').click(function(){
	window.open(this.href, '');
	return false;
	});
	$('a[@href^="http"]').not('[@href^="http://www.lllcolor.com"]').addClass("exLink");
});

下から2行目の部分は外部リンクにaddClassで”exLink”というクラスを付与するための指定です。外部リンク用に予めCSSでexLinkクラスを指定するだけでクラスをつけるのはjQueryがやってくれます。いちいち全ての外部リンクに手作業でクラスを付加する必要がないわけです。

今回はwindow.openを使って新しいウィンドウを開くようにしましたが、もちろんjQueryでtarget=_blankを付けてやることもできます。その場合は.attr()という関数を使い、.attr()(”target”,”_blank”)と指定すればOKです。

関連エントリー

現在、この記事へのトラックバックは受け付けていません。

このエントリーに投稿されたコメント

万葉 - 2007.05.18 -PM 6:59

はじめまして。万葉と申します。

参考にさせていただいたついでに、ちょっと加工してみました。
うちではPDFも外窓表示しているので、
PDFファイルを外窓表示するものを追加しました。
なかなか快適で楽しいです。

$(document).ready( function () {
$(’a[@href$=”.pdf”]’).click(function(){
window.open(this.href, ‘_blank’);
return false;
});
});

A.Kawashima - 2007.05.30 -AM 7:06

>万葉さん

はじめまして、激遅レスですいません。

なるほど、PDFも別窓の方が良いかもしれませんね。これを応用すればdocやxlsといったファイルの種別ごとにアイコンを付けたりといった事もできますね~。

コメントを投稿する場合は次のフォームよりお願いします

コメント投稿フォーム
(スタイル用HTMLタグが使えます)

ページの先頭に戻る