FrontPage > Programing に戻る
(このページは、2008年ごろに書いて、ときどき修正しています)
Photo by Gayatri Krishnamoorthy via Flickr
Bookmarklet(ブックマークレット)は、Webブラウザに追加できる小さなプログラムです。
ブックマーク(お気に入り)に置いといて、そこから呼び出す小さなプログラムなので、こんな名前になってます。
たとえば、Wikipediaや英和辞書で調べたり、今見ているWebページをちょっと加工したり、なんてことができます。
Webブラウザを使っていると、自分専用でちょっとした便利な機能が欲しくなることがありますよね。
解決する方法は色々あるけれど、とりあえずBookmarklet(ブックマークレット)が簡単なんじゃないか。
ということで、作り方を調べてみました。
ちなみに、ドラッグで選択した文字を検索するのは、ブックマークレットを使わなくても、右クリックすればOK
>>オススメのJavscript解説書
ここでは、簡単な「Hello World」から初めて、選択したテキストをYahoo!で検索するといった検索系ツールまで作成しています。
また、ブログ用にhtmlコードを生成するサンプルコードも用意してあります。
ただし、自分用にFirefox3で使える奴を作っているため、IEやOperaでは動作するか不明です。
Bookmarkletを作るには、少しばかりHTMLとJavascriptの知識が必要になります。
最近のWebサービスでは、サービスを便利にするBookmarkletを配布していることもあります。
Bookmarklet(ブックマークレット)で検索すると、いろいろ見つかります。
ブックマークレットを使うには、事前に、ブックマークツールバーを表示しておきましょう。
ここには、使用頻度の高いブックマークを登録できます。「表示」-「ツールバー」-「ブックマークツールバー」で表示されます。
ブックマークツールバーには、ドラッグ&ドロップでリンクを追加できるので、そこに使いたいBookmarkletをボタンとして登録しておくと便利です。
Webブラウザは標準で、「Googleで検索」機能を持っています。
さらに、こんな機能もありました。
でもまあ、自分で作れるという感触は重要。
Firefoxだと、Javascriptを使って、もっとすごい拡張機能を作れる。だけど、いきなりそれは難しいので、こんなところから。
さて、実際にBookmarkletを使ってみましょう。Bookmarkletは、ブックマークを利用した機能なので、リンクの仕組みを活用します。
まず、次の「Bookmarklet Test」リンクをクリックしてみてください。Yahoo Japanへ移動します。ここには、Yahooへのリンクが貼ってあります。
Firefoxで、このリンクをブックマークバーまでドラッグすると、そこに「Bookmarklet Test」というリンクボタンができあがります。このボタンをクリックすれば、どのWebページを表示していても、Yahoo!に移動できます。
では、この「Bookmarklet Test」のリンクボタンを書き直して、Bookmarkletを作ってみましょう。
Bookmarkletでは、このリンクボタンのリンク先(URL)に、Javascriptによるプログラムを設定します。Bookmarkletは、1行で書かれたJavascriptのプログラムです。リンクボタンのリンク先として、次のように書くと、クリックしたときにこのプログラムが実行できます。
javascript:(実際の処理);
リンクボタンにBookmarkletを登録するには、右クリック-「プロパティ」を選択して、URL欄に入力します。
Bookmarkletの配布サイトなどでは、Bookmarkletが設定済みのリンクが表示されているので、それを直接ブックマークツールバーにドラッグ&ドロップしても大丈夫です。ここでは、技術的な理由でそれができませんでした(Pukiwikiで直接Bookmarkletを配布する方法があるかな、ソースをいじらないとダメか)。
Hello Worldをダイアログボックスで表示します。上記の手順で、ブックマークツールバーの「Bookmarklet Test」のURL欄に次のプログラムをコピペしてください。
javascript:alert("hello%20world");
ちなみに、「%20」はスペースを表しています。
日本語も表示できます。
javascript:alert("世界の皆さん、コンニチハ");
javascript:var%20d=window.open().document; d.writeln('<textarea%20rows=1%20cols=40>'+'世界の皆さん、コンニチハ'+'</textarea>');
改行を削除してからコピペしてください。
ちょっとややこしいので、複数行に展開してみます(%20はスペースに置換)。
javascript: var d=window.open().document; d.writeln('<textarea rows=1 cols=40>'+'世界の皆さん、コンニチハ'+'</textarea>');
ダイアログで表示
javascript:var%20d=document; var%20tx=d.selection?d.selection.createRange().text:d.getSelection(); alert(tx);
「?」記号は、条件文を1行で書く、条件演算子というテクニックです。また、選択範囲のテキストを選るには、getselectionを使っています。
別ウィンドウで表示
javascript:var%20d=document; var%20tx=d.selection?d.selection.createRange().text:d.getSelection(); var%20subw=window.open().document; subw.writeln('<textarea%20rows=1%20cols=40>'+tx+'</textarea>');
改行を削除してからコピペしてください。
検索結果を別ウィンドウで表示します。
javascript:var%20d=document; var%20tx=d.selection?d.selection.createRange().text:d.getSelection(); var%20subw=window.open('http://search.yahoo.co.jp/search?p='+tx).document;
改行を削除してからコピペしてください。
ここまでくれば、あとはそのバリエーション。いくつか自分用に作った奴をおいておきます。
javascript:var%20d=document; var%20tx=d.selection?d.selection.createRange().text:d.getSelection(); var%20subw=window.open('http://ja.wikipedia.org/wiki/'+tx).document;
javascript:var%20d=document; var%20tx=d.selection?d.selection.createRange().text:d.getSelection(); var%20subw=window.open('http://eow.alc.co.jp/'+tx+'/UTF-8/?ref=sa').document;
その後、使っているWebブラウザ(Firefox)では、標準機能で、選択した語を検索することができることが判明していました。手順は、以下のとおり。
これは、Firefoxで検索できるよう登録されているなら、どれでも利用できます。あとから検索機能を追加するアドオンも出回っているので、それを使う方が便利ですね。
次は、Web更新を支援するbookmarkletについて調べてみます。ここで、Javascriptのクロージャ―とかいうテクニックが出てきます。が、サンプルコードを押さえておけば大丈夫でしょう。
これを回避する書き方が、クロージャとかいうらしい。
次のbookmarkletは、今見ているWebページのタイトルをテキストエリアに表示します。
javascript:(function(){function%20o(s){var%20d=window.open().document; d.writeln('<textarea%20rows=15%20cols=80>'+s+'</textarea>'); d.close()}var%20contents=document.title;o(contents);})();
1行だと分かりにくいので、複数行に展開してみました。
javascript:( function(){ function o(s){ var d=window.open().document; d.writeln('<textarea rows=15 cols=80>'+s+'</textarea>'); d.close() } var contents=document.title; o(contents); } )();
関数(function)の中で、関数o(s)を定義しています。で、定義したo関数に、Webページのタイトル(document.title)を渡して、別ページにテキストエリアの一部として書き込んでいます。
なぜ、これが動くのか、詳しくはクロージャ―の説明を読んでもらうとして、とりあえず、これを改造していけばいいんじゃないかな。
現在表示しているページから、ブログやWikiに貼り付ける情報を作成
javascript:(function(){function%20o(s){var%20d=window.open().document; d.writeln('<textarea%20rows=15%20cols=80>'+s+'</textarea>'); d.close()} o(document.title+"\n"+location.href);})();
これは、ながらく愛用しているので、さらにパワーアップしてみた。
javascript:(function(){function%20o(s){var%20d=window.open().document; d.writeln('<textarea%20rows=15%20cols=80>'+s+'</textarea>');d.close()}var%20prefix=''; var%20suffix='';var%20contents=document.title;var%20target='_blank'; o(prefix+'<a%20href=\''+location.href+'\'%20target=\''+target+' \'>'+contents+'</a>'+suffix);})();
javascript:(function(){function%20o(s){var%20d=window.open().document; d.writeln('<textarea%20rows=15%20cols=80>'+s+'</textarea>'); d.close()}; o('-['+document.title+']('+location.href+')');})();
javascript:(function()%20{var%20url=location.href; %20if%20(url.match(/http:\/\/(www.)?flickr.com\//))%20{ %20window.location%20='http://seanmcg.com/flickrtools/html.php?url='+url;%20} %20else%20{%20alert('You\'re%20not%20on%20Flickr!');%20}%20})()
●注:Flickrのタグ構成が変わっていて、うまく動きません(2009/04)
javascript:document.body.innerHTML.match(/property=\%22dc:title\%22>(.*?)<\/h1> [\s\S|.]*?<img%20src=\%22(.*?)\.jpg\?v[\s\S|.]*by%20<a%20href=%22\/photos\/(.*?)\/%22/); document.body.innerHTML=%22<textarea%20cols='100'%20rows='10'> <div%20style=\%22float:right;margin:5px%200px%2010px%2010px;border:dotted%201px%20#aaaaaa;padding:5px\%22>\n <a%20href=\%22%22+document.URL+%22\%22%20target=\%22_blank\%22> <img%20src=\%22%22+RegExp.$2+%22_m.jpg\%22%20style=\%22border:none\%22></a>\n <a%20href=\%22%22+document.URL+%22\%22%20target=\%22_blank\%22>%22+RegExp.$1+%22</a> <br%20/>\nPhoto%20by%20<a%20href=\%22http://www.flickr.com/photos/%22+RegExp.$3+%22/\%22%20target=\%22_blank\%22>%22+RegExp.$3+%22</a>\n </div>\n\n<br%20clear=\%22all\%22/></textarea>%22
javascript:(function(){function%20o(s){var%20d=window.open().document; d.writeln('<textarea%20rows=15%20cols=80>'+s+'</textarea>');d.close()} var%20prefix='';var%20suffix='';var%20contents=document.title;var%20target='_blank'; o(prefix+'-[['+contents+':'+location.href+']]'+suffix);})();
現在表示しているページのメールを作成
href="javascript:location.href='mailto:?SUBJECT='+encodeURIComponent(document.title)+'&BODY='+escape(location.href)
現在見ているページをGmailで送信
javascript:(function(){x=document;y=window;if(x.selection)%20{Q=x.selection.createRange().text;}%20else%20if%20(y.getSelection)%20{Q=y.getSelection();}%20else%20if%20(x.getSelection)%20{Q=x.getSelection();};m='https://mail.google.com/mail/?view=cm&fs=1&tf=1&to=&su=[FYI]%20'+encodeURIComponent(x.title)+'&body='+encodeURIComponent(x.title)+encodeURIComponent(Q)+encodeURIComponent('\n\n'+x.location);y.open(m,'addwindow','status=no,toolbar=no,width=575,height=510,resizable=yes');})();
javascript:window.open("https://twitter.com/intent/tweet? status="+encodeURIComponent(document.title)+" "+encodeURIComponent(location.href))
スマホを使うとき、やっぱりブックマークレットが欲しい。というわけで、関連リンク。
ただし、Androidの標準ブラウザでは、リンクにjavascriptを登録できません。
Android版FirefoxやOpera Mobileあたりを利用するといいでしょう。
というわけで、さらにすごい奴を作りたいなら、ちゃんとJavascript挑戦しないとネ。
>>オススメのJavscript解説書