Bookmarkletからクリップボードに文字列をコピー

前回のエントリの応用で、Bookmarkletからクリップボードにコピーすることも出来ました。なにげに便利。てか、もうこれ無しでは生きていけない予感。

今回でっちあげたURIスキーマはset-data-to-clipboard:にしてみた。前回のレジストリと同じような感覚でまず登録。今度はスクリプトをSetDataToClipBoard.jsとします。

REGEDIT4

[HKEY_CLASSES_ROOT\set-data-to-clipboard]
@="URL:Set Data To Clipboard Protocol"
"URL Protocol"=""

[HKEY_CLASSES_ROOT\set-data-to-clipboard\shell]

[HKEY_CLASSES_ROOT\set-data-to-clipboard\shell\open]

[HKEY_CLASSES_ROOT\set-data-to-clipboard\shell\open\command]
@="wscript.exe C:\\Scripts\\SetDataToClipBoard.js \"%1\""

SetDataToClipBoard.jsはこんな感じ。

var oArgs = WScript.Arguments
var s = oArgs(0);
s = s.replace(/^set-data-to-clipboard:\/\//, "");
s = s.replace(/\/$/, "");

var oIe = new ActiveXObject("InternetExplorer.Application");
oIe.Navigate("about:blank");

while (oIe.Busy) WScript.Sleep(100);

oIe.Document.parentWindow.clipboardData.setData("text", unescape(s));
oIe.Quit();

WSHでクリップボードを扱う場合、IEを隠れて起動させて、clipboardDataオブジェクトを利用するというバッド・ノウハウに基づいて、引数をクリップボードにコピーするというだけのJScriptです。JScriptな理由は、unescape()使うからというだけです。前回と違い最後に付くスラッシュを消しているのは、スラッシュがない文字列をURLスキーマに渡すとどうもWindowsが勝手にスラッシュ付けてくれちゃうみたいなので。

あとはテキトウにBookmarkletを作成してみましょう。例えば閲覧中のページのタイトルとリンクをコピーするBookmarkletだと、Locationには、

javascript:document.location.href='set-data-to-clipboard://'+escape(document.title+'\n'+document.location.href+'\n')+'/';

と、なります。エスケープしてやることと、最後にスラッシュを付けてやるのがポイント。

これでリンクタグ作成とかAmazonの個別商品リンク作成とかもコピーするのがメンドウなprompt()経由ではなく一気にクリップボードにセットできる様になります。

すげー便利だよ。俺、天才。

寝ぼけてるのか。

前回と今回のエントリを実践するのはかなりメンドウだと思いますが(説明わかりにくいし)、やれば必ずそれだけの利点はあるような気がします。

WSHマンセー。

ちなみに、前回と今回のエントリを実践するとJavaScript Consoleにガンガンエラーが溜まっていきます。まー実害はないし、個人の裁量で使うものなのでまぁ良いかなとか、投げやりな。

追記@2004/07/04

書き忘れていたのですが、インターネット オプションのセキュリティ設定のレベルのカスタマイズから、「スクリプトによる貼り付け処理の許可」を「有効にする」にしないとうまく動かないと思います。