外部リンクのブランク設定をJavascriptで制御
target=”_blank”の使用はHTMLの属性により、文法エラーになることがあります。またリンク動作はユーザに委ねるべきだということも考慮しなければなりません。
ただ、どうしても使用しなければならない場合もあると思います。それを解決するのがJavascriptです。文法エラーは無視すれば問題ないのですが、ユーザのことを考えるのであれば、これをサイトに導入すべきです。
DOMによる実装
まずはa要素を取得しよう
“getElementsByTagName”で簡単にa要素を取得できます。
変数”Anchor”にa要素を指定します。
[sourcecode language=’Javascript’]
var Anchor = document.getElementsByTagName(‘a’);
[/sourcecode]
a要素の判別
a要素をforループを使い調べます。そして要素ノードから属性ノードを取得するメソッド「getAttribute属性」を使い、”http://”で始まっているかを判別します。その際「正規表現」を使います。”/^http:\/\//”の部分が正規表現です。 “window.open”を使い外部リンクだった場合、別ウィンドウを開く処理をします。 最後に”window=onload = function()”で読み込ませ、今までの記述を合わせればOKです。 外部リンクのみにクラス指定をすることも可能です。そうすることで、外部リンクのみにアイコンを付けたりでき、視覚的に認知させることも可能です。 こちらのサンプルでは、クラス名も設定しています。 jQueryを使うと簡単に実装可能です。下の記述だけでOK。 クラス追加はjQuery無しの時とほぼ同じです。違いは”.addClass”が使用できる点です。
[sourcecode language=’Javascript’]
for (var i=0, len=Anchor.length; i
記述先はif分の間です。
[sourcecode language=’Javascript’]
a.onclick = function() {
window.open(this.getAttribute(‘href’),’_blank’);
return false;
}
[/sourcecode]動作させる
[sourcecode language=’Javascript’]
window.onload = function() {
var Anchor = document.getElementsByTagName(‘a’);
for (var i=0, len=Anchor.length; i
[sourcecode language=’Javascript’]
window.onload = function() {
var conf = {
className : ‘external’
};
var Anchor = document.getElementsByTagName(‘a’);
for (var i=0, len=Anchor.length; i
サンプルjQueryでの実装
設定は簡単
[sourcecode language=’Javascript’]
$(function() {
$(‘a[@href^=”http://”]’).click(function() {
window.open(this.href, “_blank”);
return false;
});
});
[/sourcecode]クラスを追加
[sourcecode language=’Javascript’]
$(function() {
var conf = {
className : ‘external’
};
$(‘a[@href^=”http://”]’).click(function() {
window.open(this.href, “_blank”);
return false;
})
.addClass(conf.className);
});
[/sourcecode]
COMMENT PLEASE!!
COMMENT!!
たとえばWordPressなどのツールを使っている場合
リンクのhrefは
<?php bloginfo(‘url’); ?>/about
などのように絶対パスで掃き出されるようにすることが多いので
そういう場合にも対応できるように
if(a.getAttribute(‘href’).match(/^http:\/\//))
は、http://のマッチングに加えてドメインが違うリンクのみに適用すると広く使えます。
var href = a.href, host = new RegExp(location.hostname);
if(href.match(/^http\:\/\/) && !href.match(host))
確かに同ドメイン内のリンクがブランクになると困りますね。WordPressを使用しているのにその事を忘れてました。
いつもありがとうございます!!