スライドショー

http://www.babyanimalz.com/ という素敵なサイトを見つけたんですが、画像を一つひとつ見ていくのがめんどくさいなと感じました。なので、(同様のものが既にあるかな、とは思ったんですが) ブックマークレットを作ってみました。

とは言え、本格的なものを作るのは初めてだったので随分苦労しまして、出来もあまり満足行ってません。

javascript:(function (){var imgs=(function (){function isImg(url){return url.match(/\.(?:jpe?g|png|gif|bmp)$/i);} function collectImg(){var lnks=document.links;var arr=[];var i=0, j=0;for (i=0;i';if (++i>=imgs.length) i=0;});document.body.click();})();

適当な名前で、上の URL をターゲットとするブックマークを作ってください (Tip: トリプルクリックで一発選択できます)。

IE でしかテストしてないんですが、他でも動けばいいな、と思ってます。

画像へのリンクがあるページで実行すると、スライドショーが始まります。凝ったものではなく、IMG タグを使っているだけです。クリックで次の画像に移り、永久にループします。

Update:

ブックマークレットのコツを掴んできたところで、改訂版です。

クリックに加えてキー入力も受け付けます。n で前方、p で後方に進みます。進行方向を保持しますので、p を押した後にクリックを押すと後方に進みます。エンターキーにはクリックと同じ意味を持たせてあります。

javascript:(function(g,i,f){g=(function(l,a,j,k){l=document.links,a=[],j=0,k=0;for(j=0;j=l)i=0;f=1}else if(c==112){if(--i<0)i=l-1;f=0}else return}body.innerHTML='<'+'img src='+g[i]+'>'});with(body){background='';click()}}})()

Update 2 [20060114]:

ちょっと遅れましたが、最後に参考文献です。

http://www.teria.com/~koseki/memo/bookmarklets/
はてな関連のものを含め、十以上のブックマークレットや、作成・公開用キットなどが公開されています。
tips のページにはブックマークレット作成の際の注意事項がまとめられています。勉強になりました。

http://www-ui.is.s.u-tokyo.ac.jp/~tnishida/bookmarklets/
高度で印象的なブックマークレットや、作成用のツールが公開されています。IE が主なターゲットのようです。
JavaScript で var を使わずにローカル変数を宣言する方法など、字数節約のコツを学ばせていただきました。

Update 3 [20060116]:

コメントにて id:brazil さんに御指摘を頂き、幾つか修正ポイントが見つかりました。

var を使わなければ字数を節約できる (IE は字数制限が厳しいのです) と思ってしまいましたが、これは変数の数に拠りますね。変数をローカルにするために関数の引数リストに変数を置いたんですが、数が増えると "var " の 4 字を節約できるメリットをかえって損ねてしまいます。なので、普通に var を使って定義した方が良いだろう、ということになります。

また、"javascript:foo='bar'" のようなコードをアドレスバーで実行してみると分かるんですが、コード (の最後の式) が値を返さないように工夫しなければいけません。上のコードで void を使っているのはそのことが頭にあったからなんですが、使ってる場所がおかしいですね。意味がありませんでした (私のコメントレスは、まだそのことが理解できてない時のものです)。

Update 4 [20060117]:

void の用法が理解し切れてませんでしたので、再度補足させてください。

ブックマークレットでは、コードの最後の式が値を生じないようにする必要があるわけです。そのため、値を生じる式は void で囲えば良いんですが、最後の式が関数呼び出しである場合、明示的に return しない限り値は返しませんよね (Ruby ではないので)。なので、関数の中ではまず void を使う必要は無い、ということになります。この点が "Update 3" の記述では不正確だったと思います。

(上でコメント時には理解してなかったと書きましたが、結局その時の発言主旨で合っていたようです。ひとり混乱してしまってすいません。)