从网站复制/粘贴时编辑剪贴板数据

时间:2010-03-08 10:50:45

标签: javascript web-applications clipboard dhtml copy-paste

我现在看到一些网站,如果你突出文章的文字,复制它,然后粘贴,他们可以添加更多的文字。

尝试复制并粘贴http://belfasttelegraph.co.uk/文章中的一段文字,您会看到我的意思 - 他们会在粘贴的文字中添加原始文章的链接。

这是怎么做到的?我假设这里有一些javascript工作

5 个答案:

答案 0 :(得分:8)

这是一个很好的效果,您可以看到使用Firebug(在Firefox中)在副本上触发的脚本。

启动Firebug并加载页面,选择clear(因为页面使用了很多ajax,有很快的100个请求)。然后选择“全部”选项卡并尝试复制。您将看到1x1像素图像的请求,但如果您按+按钮查看详细信息,您将在'params'选项卡中看到此GET请求将您请求的文本作为'content'参数传递,将用于操纵剪贴板DOM的xpath信息:

start_node_xpath    /HTML/BODY[@id='belfast']/DIV[@id='root']/DIV[@id='content']/DIV[@id='mainColumn']/DIV[@id='article']/DIV[5]/P[39]/text()

end_node_xpath  /HTML/BODY[@id='belfast']/DIV[@id='root']/DIV[@id='content']/DIV[@id='mainColumn']/DIV[@id='article']/DIV[5]/P[41]/text()

正如@Crimson指出的那样,有一些操作剪贴板的方法,like zeroclipboard使用Flash和图像。

我认为通过使用图像获取请求来更改剪贴板是如何完成该技术的。

答案 1 :(得分:3)

您会注意到只有当您使用组合键[Ctrl + C]时才会发生这种情况,如果您突出显示文本并从右键单击菜单中选择了副本,则不会发生这种情况。

他们只是捕捉[Ctrl + C]击键。

此外,要将数据添加到剪贴板,请查看此帖子: How do I copy to the clipboard in JavaScript?

答案 2 :(得分:1)

我最近注意到这个"剪贴板劫持"在网站上。 thefutoncritic.com,cracked.com ...如果您使用Adblock,请进入"手册条目"列出并添加 * post-copypaste.js * 。这样可以防止网站将广告添加到剪贴板中。

答案 3 :(得分:1)

其他网站使用的其他解决方案是使用jQuery和'copy'/'cut'事件:

$('body').bind('copy cut',function(e){manipulate();});

这里有一些例子: http://www.mkyong.com/jquery/how-to-detect-copy-paste-and-cut-behavior-with-jquery/

答案 4 :(得分:0)

我访问的新闻网站使用此功能附加"来源"复制的选择:

function addLink() {
    var body_element = document.getElementsByTagName('body')[0];
    var selection;
    selection = window.getSelection();
    // change this if you want
    var pagelink = "<br><br>Fuente: Emol.com - <a href='"+document.location.href+"'>"+document.location.href+"</a><br>";
    var copytext = selection + pagelink;
    var newdiv = document.createElement('div');
    newdiv.style.position='absolute';
    newdiv.style.left='-99999px';
    body_element.appendChild(newdiv);
    newdiv.innerHTML = copytext;
    selection.selectAllChildren(newdiv);
    window.setTimeout(function() {
        body_element.removeChild(newdiv);
    },0);
}
document.oncopy = addLink;