2009-07-04

javascriptからClipboardを制御したい

Javascriptから、何とかして、自由にClipboardの読み書きがしたい。もちろん、それがセキュリティ上問題のあることは分かっている。私は別に、Webサイト上の任意のスクリプトからのクリップボードへのアクセスを許可しようではないかと提案しているのではない。私は、自分の書いたuser scriptやbookmarkletから、クリップボードを使いたいのだ。

user scriptやbookmarkletのコードは、大抵自分で書いたものか、あるいは、確実に信頼できると判断したものである。何故ならば、これらのコードが実行された場合、いつでも自由に、iframeを使って別のページを読み込めるのである。その際、URL中に、現在閲覧しているサイトなどの情報を含めることができるので、user scriptやbookmarkletのコードは、確実に信頼できると判断したものでなければ使ってはいけない。とすれば、何もuser scriptやbookmarlketからクリップボードに読み書きできたぐらいで、セキュリティ上の危険が増すとも思えない。

こういう考えを起こしたのには理由がある。

このブログの記事は、すべてHTMLを手打ちしている。といっても、主にパラグラフごとにp要素で囲むぐらいだから、それほどの手間ではない。ところが、別のページへのリンクを張りたい時というのがよくある。別に、a要素を手で書くのは、それほど難しくはない。ただし、面倒である。というのもページへのURLだけでなく、実際に表示する文字も、指定しなければならないからだ。私はほとんどの場合、そのページのタイトルを使う。(たまに、奇を衒う目的で、別の言葉を使うこともある。例えば、すばらしい百科辞典など) 多くのブラウザは、ページのタイトルをクリップボードにコピーする機能を提供していないので、わざわざソースを見て、title要素からコピペしなければならない。今までそうしてきたが、ふと思った。」何故こんな機械でもできることを人間である私がやらなければならないのか」と。

そこで、そのサイトへのリンクを貼るa要素を生成するbookmarkletを書いた。

javascript:(function()
{
    return ( "<a href='" + document.URL + "'>" + (document.title ? document.title : document.URL) + "</a>" ) ;
})() ;

たとえば、このブログに対して、上記のbookmarkletを適用した場合、<a href='http://cpplover.blogspot.com/'> 本の虫 </a>が出力される。現在見ているページが切り替わってしまうのは異論があるだろうが、私はminimalistなので、これで十分なのだ。たぶん、ページを書き換えずにやりたければ、divをfloatさせてz-indexの一番上に表示させるとかだろうか。

ああ、クリップボードを読み書きする機能が欲しい。方法はあるものの、ブラウザによっては、セキュリティ上の観点から、コピーする文字は選択されていなければならなかったり、ユーザーの入力の際のみに操作を行えるなどの、厳しい制約がある。Flashを使う反則なjavascriptのライブラリも見つけたが、これもやはり、マウスクリックという、ユーザーの入力に応じてしか使えないのだ。それなら、別に文字列を直接出力したって変わらない。上記のbookmarkletでも、Ctrl+A、Ctrl+Cでコピーできるのだから。

というわけで、ユーザースクリプトには、クリップボードを読み書きする機能を提供しても、セキュリティ上の懸念は低く、利益も大きいのではないかと思う次第である。

IEのようなのもどうかと思うが。

3 comments:

Anonymous said...

> ページを書き換えずにやりたければ、divをfloatさせてz-indexの一番上に表示させるとかだろうか。
javascirpt:prompt('','...');void(0);
とやるのがよいと思います。

Anonymous said...

すみません、リンクになってしまったのでもう一度。
javascirpt:prompt('','<a href="...">...</a>');void(0);

江添亮 said...

おお、これは便利便利。
重箱の隅をつつくようですが、javascriptですな。