clipboard.js
将文本复制到剪贴板应该不难。它不需要数十个步骤来配置或数百 KB 来加载。但最重要的是,它不应该依赖于 Flash 或任何臃肿的框架。
现代复制到剪贴板。没有闪光灯。压缩后只有 3kb。
将文本复制到剪贴板应该不难。它不需要数十个步骤来配置或数百 KB 来加载。但最重要的是,它不应该依赖于 Flash 或任何臃肿的框架。
这就是 clipboard.js 存在的原因。
你可以在 npm 上得到它。
npm install clipboard --save
或者,如果您不熟悉包管理,只需下载一个 ZIP文件。
首先,包含位于文件夹中的脚本或从第三方 CDN 提供商 dist
加载它。
<script src="dist/clipboard.min.js"></script>
现在,您需要通过传递 DOM 选择器、HTML 元素或HTML 元素列表来实例化它。
new ClipboardJS('.btn');
在内部,我们需要获取与您的选择器匹配的所有元素并为每个元素附加事件侦听器。但猜猜怎么了?如果您有数百个匹配项,则此操作会消耗大量内存。
出于这个原因,我们使用事件委托,它用一个监听器替换多个事件监听器。毕竟,#perfmatters。
我们生活在声明式复兴中,这就是为什么我们决定利用HTML5 数据属性来提高可用性。
一个非常常见的用例是从另一个元素复制内容。您可以通过 data-clipboard-target
在触发器元素中添加一个属性来做到这一点。
您在此属性中包含的值需要与另一个元素选择器匹配。
<!-- Target -->
<input id="foo" value="https://github.com/zenorocha/clipboard.js.git" />
<!-- Trigger -->
<button class="btn" data-clipboard-target="#foo">
<img src="assets/clippy.svg" alt="Copy to clipboard" />
</button>
此外,您可以定义一个属性来指定是否 data-clipboard-action
要指定内容。copy``cut
如果省略此属性,copy
将默认使用。
<!-- Target -->
<textarea id="bar">Mussum ipsum cacilds...</textarea>
<!-- Trigger -->
<button class="btn" data-clipboard-action="cut" data-clipboard-target="#bar">
Cut to clipboard
</button>
如您所料,该 cut
操作仅适用于 <input>
or <textarea>
元素。
事实是,您甚至不需要另一个元素来复制其内容。您可以 data-clipboard-text
在触发器元素中包含一个属性。
<!-- Trigger -->
<button
class="btn"
data-clipboard-text="Just because you can doesn't mean you should — clipboard.js"
>
Copy to clipboard
</button>
在某些情况下,您希望显示一些用户反馈或捕获复制/剪切操作后选择的内容。
这就是为什么我们会触发自定义事件,例如 success
和 error
让您监听和实现您的自定义逻辑。
var clipboard = new ClipboardJS('.btn');
clipboard.on('success', function (e) {
console.info('Action:', e.action);
console.info('Text:', e.text);
console.info('Trigger:', e.trigger);
e.clearSelection();
});
clipboard.on('error', function (e) {
console.error('Action:', e.action);
console.error('Trigger:', e.trigger);
});
如需现场演示,请访问此站点并打开您的控制台。
每个应用程序都有不同的设计需求,这就是为什么 clipboard.js 不包含任何 CSS 或内置工具提示解决方案。
您在演示站点上看到的工具提示是使用GitHub 的 Primer构建的。如果您正在寻找类似的外观和感觉,您可能需要检查一下。
如果您不想修改 HTML,那么有一个非常方便的命令式 API 供您使用。你需要做的就是声明一个函数,做你的事,然后返回一个值。
例如,如果要动态设置 a target
,则需要返回一个 Node。
new ClipboardJS('.btn', {
target: function (trigger) {
return trigger.nextElementSibling;
},
});
如果您想动态设置 a text
,您将返回一个字符串。
new ClipboardJS('.btn', {
text: function (trigger) {
return trigger.getAttribute('aria-label');
},
});
为了在 Bootstrap Modals 或任何其他改变焦点的库中使用,您需要将焦点元素设置为 container
值。
new ClipboardJS('.btn', {
container: document.getElementById('modal'),
});
此外,如果您正在使用单页应用程序,您可能希望更精确地管理 DOM 的生命周期。以下是清理我们创建的事件和对象的方法。
var clipboard = new ClipboardJS('.btn');
clipboard.destroy();
这个库依赖于Selection和execCommand API。所有浏览器都支持第一个,而以下浏览器支持第二个。
42+✔ | 12+✔ | 41+✔ | 9+✔ | 29+✔ | 10+✔ |
好消息是,如果您需要支持旧版浏览器,clipboard.js 会优雅地降级。您所要做的就是显示一个工具提示,说明 Copied!
何时 success
调用事件以及 Press Ctrl+C to copy
何时调用 error
事件,因为文本已被选中。
您还可以通过运行检查是否支持 clipboard.js ClipboardJS.isSupported()
,这样您就可以从 UI 中隐藏复制/剪切按钮。
一个浏览器扩展,为GitHub、MDN、Gist、StackOverflow、StackExchange、npm 甚至 Medium上的每个代码块添加“复制到剪贴板”按钮。
MIT© Zeno Rocha