我需要一种将动态(Ajax)加载的内容复制到 Web 浏览器中的剪贴板的方法。有许多库可以使用 Flash 模拟复制到剪贴板的功能。但是,使用新的Flash 10 默认安全设置,复制到剪贴板设置现在需要明确的用户确认。 ZeroClipboard是一个 Javascript/Flash 库,可以绕过这个“限制”(使用 Flash 电影点击劫持)。
这是我编写的一个简单的 JQuery 插件,用于将 ZeroClipboard 集成到我的应用程序中:
// 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 影片(click-jacked 链接)时,它会通过 Ajax 和 ZeroClipboard 将锚点对应的文本文件加载到剪贴板中。
这个插件在 Safari 中运行良好(即使是 4000+ 行的prototype.js 文本文件)。然而,它在 FF3.0 上失败了,即使在一个简单的文本文件中也只有一行:“hello”。我已将 Ajax 调用的内容记录到控制台中。成功回调似乎确实有效。似乎第二次单击电影将完成复制(因为浏览器缓存了第一次 Ajax 调用的文本文件)。
请注意,我在这里使用了同步 Ajax 调用来等待文本完成加载。任何人都知道为什么我的代码不能按预期工作?(不确定是否相关,我的后端是在 Rails 中完成的)。