复制到剪贴板而不使用Flash


90

我发现了很多复制到剪贴板的解决方案,但是它们要么全部使用Flash,要么用于网站。我正在寻找自动复制到剪贴板的方法,不带Flash,并且对于用户端,它适用于用户脚本,当然也适用于跨浏览器。


找不到任何东西,一直在寻找相同的东西。确实不想使用Flash从而在创建之前就删除了此功能。
eugeneK 2011年


1
如果不使用FLASH,我怀疑您可以在各种浏览器中完成它。但是有可用的具体解决方案可以帮助您获得解决方案“ 零剪贴板”
Rakesh Sankar,

Rakesh-您的“具体解决方案”基于Flash。我无法在任何浏览器中使用它。
RobG 2011年

1
stackoverflow.com/questions/400212/…中的 @wizztjh方法适用于网站端,而不适用于用户端@Rakesh zeroclipboard很好,但我想完全不用Flash来找到方法
Black_Sun 2011年

Answers:


31

如果没有Flash,则在大多数浏览器中根本无法实现。用户的剪贴板是与安全性相关的资源,因为它可能包含密码或信用卡号之类的内容。因此,浏览器正确地不允许Javascript访问它(有些浏览器允许它显示警告,表明用户已经确认或带有已签名的Javascript代码,但没有一个是跨浏览器的)。


21
所以也许页面不应该能够从剪贴板中读取,但是为什么不写呢?= /
Ajedi32

5
但是,为什么要允许它通过涉及零用户通知和反馈的隐藏闪存发生呢?
埃里克·格兰奇

3
@EricGrange:因为早在1990年代中期,Netscape就有人决定出于性能原因,浏览器插件将是本机二进制文件,因此几乎可以执行任何操作。当时的在线世界是一个非常简单的地方,安全性不是什么大问题。
Michael Borgwardt 2014年

4
虽然这个答案在2011年是正确的,但浏览器在消除Flash的斗争中已经走了很长一段路。请在下面查看我的答案。
Hovis Biddle 2015年

25

我曾经尝试过Flash解决方案,但我也不喜欢。太复杂,太慢。我要做的是创建一个文本区域,将数据放入其中,并使用浏览器的“ CTRL + C”行为。

jQuery javascript部分:

// catch the "ctrl" combination keydown
$.ctrl = function(key, callback, args) {
    $(document).keydown(function(e) {
        if(!args) args=[]; // IE barks when args is null
        if(e.keyCode == key && e.ctrlKey) {
            callback.apply(this, args);
            return false;
        }
    });
};

// put your data on the textarea and select all
var performCopy = function() {
    var textArea = $("#textArea1");
    textArea.text('PUT THE TEXT TO COPY HERE. CAN BE A FUNCTION.');
    textArea[0].focus();
    textArea[0].select();
};

// bind CTRL + C
$.ctrl('C'.charCodeAt(0), performCopy);

HTML部分:
<textarea id="textArea1"></textarea>

现在,将您要复制的内容放在“在此处复制文本”。可以是一个功能。区。我的工作对我来说很好。您只需要组合一个CTRL + C。唯一的缺点是您的站点上将显示一个难看的文本区域。如果使用style =“ display:none”,则复制解决方案将无法使用。


6
这似乎仅将Ctrl + C的功能绑定到javascript函数,而没有将数据放置在OS剪贴板中。
Ishmael

当然,这就是想法。为您制作浏览器副本。这里有一个类似的解决方案:kickoutjs.com/examples/clickCounter.html。当您双击它们时,它们将通过javascript和内容创建一个文本区域。
Julio Saito

在osx上对我不起作用,因此我添加e.metaKey了keydown比较,但是由于某种原因,没有触发复制操作。看到这个小提琴:jsfiddle.net/gableroux/gta67/1
GabLeRoux

2
@GabLeRoux仅当选择了文本时,才会启用safari中的复制功能。以前确实可以使用,但最近对野生动物园的更新已将其停止。似乎在调用key down事件之后选择文本只会在该浏览器中不再剪切文本。但是在chrome中仍然可以正常工作。哦,好吧,可能不得不退回到只为该浏览器使用Flash的方式了。–
Aran Mulholland 2013年

像这样。当您无法隐藏(由于任何原因)不需要看到的元素时,可以始终将其放置在远离起点的位置,例如padding-bottom:-1000。
m3nda 2014年



3

不耐烦地等待剪贴板API的 Xbrowser支持时...


这将在Chrome,Firefox,Edge,IE中完美运行

IE只会提示用户一次访问剪贴板。
Safari浏览器(5.1在写作的时间)不支持execCommandcopy/cut

/**
 * CLIPBOARD
 * https://stackoverflow.com/a/33337109/383904
 */
const clip = e => {
  e.preventDefault();
  
  const cont = e.target.innerHTML;
  const area = document.createElement("textarea");
  
  area.value = e.target.innerHTML; // or use .textContent
  document.body.appendChild(area);
  area.select();
 
  if(document.execCommand('copy')) console.log("Copied to clipboard");
  else prompt("Copy to clipboard:\nSelect, Cmd+C, Enter", cont); // Saf, Other
  
  area.remove();
};


[...document.querySelectorAll(".clip")].forEach(el => 
  el.addEventListener("click", clip)
);
<a class="clip" href="#!">Click an item to copy</a><br>
<a class="clip" href="#!"><i>Lorem</i></a><br>
<a class="clip" href="#!"><b>IPSUM</b></a><br>

<textarea placeholder="Paste here to test"></textarea>

所有的浏览器(Firefox的除外,它能够只处理MIME类型"plain/text",据我测试过)都没有实现剪贴板API。即,尝试使用读取Chrome中的剪贴板事件

var clipboardEvent = new ClipboardEvent("copy", {
        dataType: "plain/text",
        data: "Text to be sent to clipboard"
});

抛出:未捕获的TypeError:非法的构造函数

浏览器和剪贴板之间发生的令人难以置信的混乱的最佳资源可以在此处(caniuse.com)看到(→请遵循“注释”下的注释)。
MDN表示,对所有浏览器的基本支持都是“(YES)”,这是不准确的,因为人们根本希望至少该API能够正常工作。


1

您可以使用HTML页面本地的剪贴板。这样,您就可以在HTML页面内复制/剪切/粘贴内容,但不能在第三方应用程序之间或在两个HTML页面之间复制/剪切/粘贴内容。

这是您可以编写自定义函数来执行此操作的方法(已在chrome和firefox中测试):

这是演示如何执行此操作的FIDDLE

我还将在这里粘贴小提琴以供参考。


的HTML

<p id="textToCopy">This is the text to be copied</p>
<input id="inputNode" type="text" placeholder="Copied text will be pasted here" /> <br/>

<a href="#" onclick="cb.copy()">copy</a>
<a href="#" onclick="cb.cut()">cut</a>
<a href="#" onclick="cb.paste()">paste</a>

JS

function Clipboard() {
    /* Here we're hardcoding the range of the copy
    and paste. Change to achieve desire behavior. You can
    get the range for a user selection using
    window.getSelection or document.selection on Opera*/
    this.oRange = document.createRange();
    var textNode = document.getElementById("textToCopy");
    var inputNode = document.getElementById("inputNode");
    this.oRange.setStart(textNode,0);
    this.oRange.setEndAfter(textNode);
    /* --------------------------------- */
}

Clipboard.prototype.copy = function() {
    this.oFragment= this.oRange.cloneContents();
};

Clipboard.prototype.cut = function() {
    this.oFragment = this.oRange.extractContents();
};

Clipboard.prototype.paste = function() {
    var cloneFragment=this.oFragment.cloneNode(true)
    inputNode.value = cloneFragment.textContent;
};

window.cb = new Clipboard();

嘿,mtBrona。您是否有办法为此附加一些jsfiddle?似乎无法激活它
neoswf 2013年

我们可以在这里传递字符串代替
经典

这仅在您位于同一个地方时才有效window。这不是操作系统和其他浏览器选项卡可用的实际剪贴板。同样,选择也可以轻松完成,select()而不是简单window.getSelection()
Roko C. Buljan 2015年

0

document.execCommand('copy')会做你想要的。但是此线程中没有直接可用的示例而不会产生混乱,因此这里是:

var textNode = document.querySelector('p').firstChild
var range = document.createRange()
var sel = window.getSelection()

range.setStart(textNode, 0)
range.setEndAfter(textNode)
sel.removeAllRanges()
sel.addRange(range)
document.execCommand('copy')

-2

没有办法,您必须使用闪光灯。有一个名为jquery.copy的JQuery插件,它使用Flash(swf)文件提供了跨浏览器的复制和粘贴。这类似于我博客上的语法突出显示器的工作方式。

引用jquery.copy.js文件后,只需执行以下操作即可将数据推入剪贴板:

$.copy("some text to copy");

好,易于 ;)


链接断开(文件不再可供下载)
SeinopSys
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.