動的に (Ajax) ロードされたコンテンツを Web ブラウザーのクリップボードにコピーする方法が必要です。Flash を使用してクリップボードへのコピー機能を模倣する多くのライブラリがあります。ただし、新しいFlash 10 のデフォルトのセキュリティ設定では、クリップボードへのコピーの設定では明示的なユーザー確認が必要になりました。 ZeroClipboardは、この「制限」を回避する Javascript/Flash ライブラリです (Flash ムービーのクリックジャッキングを使用)。
これは、ZeroClipboard をアプリケーションに統合するために作成した単純な JQuery プラグインです。
// A jQuery plugin for copying Ajax content into clipboard
(function($) {
$.fn.clickToClipboard = function() {
$(this).each( function() {
var link = $(this);
if ( link.is('a') ) {
var clip = new ZeroClipboard.Client();
clip.glue(this);
clip.addEventListener('onMouseDown', function(){
link.html('copying...');
clip.reposition();
$.ajax({
url: link.attr('href'),
success: function(content) {
clip.setText(content);
},
async: false
});
});
clip.addEventListener('onComplete', function(){
link.html('copied!');
clip.reposition();
});
}
});
}
})(jQuery);
各アンカー URL は、サーバー上のテキスト ファイルを指しています。Flash ムービー (クリックジャック リンク) がクリックされると、アンカーの対応するテキスト ファイルが Ajax と ZeroClipboard を介してクリップボードに読み込まれます。
このプラグインは Safari で非常にうまく機能します (4000 行以上のprototype.js テキスト ファイルでも)。ただし、「hello」という 1 行の単純なテキスト ファイルでも、FF3.0 では失敗します。Ajax 呼び出しの内容をコンソールに記録しました。成功のコールバックは機能しているようです。ムービーを 2 回クリックするとコピーが完了するようです (ブラウザーは最初の Ajax 呼び出しからのテキスト ファイルをキャッシュするため)。
ここでは、テキストの読み込みが完了するまで待機するために、同期 Ajax 呼び出しを使用していることに注意してください。私のコードが期待どおりに動作しない理由を知っている人はいますか? (関連性があるかどうかはわかりません。私のバックエンドは Rails で行われています)。