11月 20
Posted at 17:59 by Hiro

外部サイトのリンクを別タブで開く方法のエントリで紹介したjQueryは、自分でコンテンツを管理しているサイト中でなければ使えません。これをなんとかブックマークレットにして、他のサイトでも使えるようにはできないものかと考えてみました。

閲覧しているサイトが必ずしもjQueryを使っているとは限りませんので、jQueryをブックマークレット中で使えるようにするためには、必要に応じてjQueryをロードしなければなりません。

jQueryを動的にロードするブックマークレットというとjQuerifyが有名ですね。検索すると改良版がいろいろ出てきますが、それらを参考にしながら作ってみました。

まずは、プレーンなコードです。

if (!window.jQuery) {
  (function(s) {
    s.src = 'http://jquery.com/src/jquery-latest.js';
    document.getElementsByTagName('body')[0].appendChild(s);
  })(document.createElement('script'));
}

余分なスペースやセミコロン、括弧などを消していって、コードをブックマークレット化すると…

javascript:(function(){if(!window.jQuery)(function(s){s.src='http://jquery.com/src/jquery-latest.js';document.getElementsByTagName('body')[0].appendChild(s)})(document.createElement('script'))})();void(0)

できあがったブックマークレットがこちら: Embed jQuery

続いて、リンクを別タブで開くようにするためのコードです。
まず、前回のエントリで紹介したjQueryをおさらいしておきましょう。

$(function() {
    $("a:not([href^='<?php echo get_settings('home'); ?>'])").attr("target", "_blank");
});

上記のコードは、WordPress内に直接コーディングしたPHPなので、実際にブラウザが受信するjQueryに置き換えます。

$(function() {
    $("a:not([href^='http://h2plus.biz/blog/'])").attr("target", "_blank");
});

自分の運営するサイトであれば、ベースになるURL(http://h2plus.biz/blog/)をハードコーディングできますが、ブックマークレットとして汎用的に使えるように改良します。リンク先のURLには、以下の4パターンが考えられますね。

  1. 外部サイト – 例: http://www.google.co.jp/path/file
  2. 自サイト(絶対URL表記) – 例: http://h2plus.biz/path/file
  3. 自サイト(絶対パス表記) – 例: /path/file
  4. 自サイト(相対パス表記) – 例: path/file | ./path/file | ../path/file

このうち「1. 外部サイト」だけに絞り込むようなセレクタを作ります。

$("a[href^='http://']:not([href^='http://"+location.hostname+"'])").attr("target", "_blank");

セレクタの前半部分([href^='http://'])で、「1. 外部サイト」と「2. 自サイト(絶対URL表記)」の2つに絞り込まれます。さらに、閲覧中のページのホスト名を使って自サイトを除外するという段取りです。

あとはブックマークレット化するだけ。

javascript:(function(){$("a[href^='http://']:not([href^='http://"+location.hostname+"'])").attr('target','_blank')})();void(0)

できあがったブックマークレットがこちら: Another Tab

この2つのブックマークレットを1つにまとめられないかと試行錯誤しましたが、うまくいきませんでした。閲覧しているサイトでjQueryが使われているかどうかなんて気にしないので、結局のところ2クリックしなければならない。検索エンジンの結果ならば、毎リンクを「右クリック&別タブで開く」する手間は省けるだろうが…。


2 Responses to “外部サイトのリンクを別タブで開くブックマークレット”

  1. 1. greencard Says:

    Why this web site do not have other languages support?

  2. 2. Hiro Says:

    To greencard:
    Because I’m Japanese! However, I think you can understand what is presented if you know JavaScript and jQuery.
    This entry introduces two bookmarklets. The first loads jQuery core script into your page, which I rewrote jQuerify. The second replaces any links to out of your site to open with anothor tab in your browser. I wonder if I can put these two feature into one bookmarklet…

コメントをどうぞ