[jQuery] imgタグを含まないaタグ(外部リンク)にtarget=_blankを付けてアイコンを表示する方法
2 min read
かなり欲張りなタイトルですが、こういう感じです。
- 外部リンクである<a>タグに
target=_blank
を付ける - 外部リンクである<a>タグの後にアイコンを付ける
- ただし<img>を包括する<a>タグは除く
検索したら出てきた方法
$('a[href^="http://"]')
.not('a[href^="http://hoge.hoge/"]')
.click(function () {
window.open($(this).attr("href"), "_blank");
return false;
})
.not(":has(img)")
.addClass("icon-class");
外部リンクである<a>タグをクリックした際にtarget=_blank
を付けてるようです。
これでも問題はないのですが、ドメインを変更やローカル環境でのテストなどメンテナンスが面倒くさいです。
私の場合
色々と方法はあるかと思いますが、個人的にはシンプルでメンテナンスのしやすい以下の方法で解決しています。
var host = new RegExp("/" + window.location.host + "/");
$("a").each(function () {
if (!host.test(this.href)) {
var $this = $(this);
// 外部リンクに target=_blank を付ける
$this.attr("target", "_blank");
// 画像を包括していない<a>タグにアイコンを付ける
$this.not(":has(img)").append($.parseHTML('<span class="icon-popup" />'));
}
});
- 各<a>タグを検索します。実際は .find() などで検索範囲を狭めるのが良いです
- 正規表現を使い、表示しているページのホストと<a>タグの
href
がとマッチしないかをチェックします。 - マッチしない場合(=外部リンク)、target=_blankを付けます。
- マッチしない場合(=外部リンク)で、画像を包括していないなら<a>タグにアイコンを付けます。