cut 动作只对 input 或 textarea 元素生效;库本身不含任何 CSS 或 tooltip,需自行实现提示样式;在 Bootstrap Modal 等会改变焦点的场景需显式传入 container 选项
clipboard.js
zenorochaMIT更新放缓轻量级 JavaScript 库,用 3KB 压缩体积实现现代浏览器的一键复制到剪贴板,彻底摆脱 Flash 依赖。
:scissors: Modern copy to clipboard. No Flash. Just 3kb gzipped :clipboard:
npm install clipboard --save
<script src="dist/clipboard.min.js"></script>
new ClipboardJS('.btn');README 未说明;这是浏览器端 JS 库,无 GPU 或显存要求,依赖浏览器 Selection 与 execCommand API
轻量级浏览器剪贴板库,无需 Flash,压缩后仅 3kb,用 data 属性即可实现复制与剪切
轻量级 JavaScript 库,用 3KB 压缩体积实现现代浏览器的一键复制到剪贴板,彻底摆脱 Flash 依赖。
核心能力
- 用 data-clipboard-target 复制指定元素内容
- 用 data-clipboard-action 切换 copy 或 cut
- 用 data-clipboard-text 直接复制属性文本
- 通过事件委托只挂一个监听器,节省内存
- 提供 success 与 error 事件回调做用户反馈
容易踩的坑
- v2.0.11Fixes & DX Enhancements最新正式版2022-05-04 · 2022-05-04 17:59 UTC
- Fix type for copy function #795
- Remove blurring behavior after copy action invoke #807
- Support more HTML input types #808
- v2.0.10Fixes and Docs Updates2022-02-02 · 2022-02-02 15:28 UTC
查看更新说明
- Fix Event API issue returning a function instead of a string in the
Event.Actionproperty - Update docs to make it easier to track Event API
- Update tests to cover
Event.Actionproperty
- Fix Event API issue returning a function instead of a string in the
- v2.0.92022-01-28 · 2022-01-28 02:03 UTC
查看更新说明
- Add new API methos
.cutand.copy - Improve code internals
- Add new API methos
- v2.0.82021-03-10 · 2021-03-10 20:51 UTC
查看更新说明
- Fix webpack5 es6 export issue https://github.com/zenorocha/clipboard.js/pull/741
- Fix Typescript definitions https://github.com/zenorocha/clipboard.js/pull/736
- v2.0.7V2.0.72021-03-06 · 2021-03-06 13:27 UTC
查看更新说明
Fix Textarea not being removed from DOM
Related issue https://github.com/zenorocha/clipboard.js/issues/732
用户点评
登录用户的真实使用记录,可按版本和硬件筛选还没有人点评。第一个说出真实体验的人最有价值。
clipboard.js
Modern copy to clipboard. No Flash. Just 3kb gzipped.
Why
Copying text to the clipboard shouldn't be hard. It shouldn't require dozens of steps to configure or hundreds of KBs to load. But most of all, it shouldn't depend on Flash or any bloated framework.
That's why clipboard.js exists.
Install
You can get it on npm.
npm install clipboard --save
Or if you're not into package management, just download a ZIP file.
Setup
First, include the script located on the dist folder or load it from a third-party CDN provider.
<script src="dist/clipboard.min.js"></script>
Now, you need to instantiate it by passing a DOM selector, HTML element, or list of HTML elements.
new ClipboardJS('.btn');
Internally, we need to fetch all elements that matches with your selector and attach event listeners for each one. But guess what? If you have hundreds of matches, this operation can consume a lot of memory.
For this reason we use event delegation which replaces multiple event listeners with just a single listener. After all, #perfmatters.
Usage
We're living a declarative renaissance, that's why we decided to take advantage of HTML5 data attributes for better usability.
Copy text from another element
A pretty common use case is to copy content from another element. You can do that by adding a data-clipboard-target attribute in your trigger element.
The value you include on this attribute needs to match another's element selector.
<!-- Target -->
<input id="foo" value="https://github.com/zenorocha/clipboard.js.git" />
<!-- Trigger -->
<button class="btn" data-clipboard-target="#foo">
<img src="https://raw.githubusercontent.com/zenorocha/clipboard.js/HEAD/assets/clippy.svg" alt="Copy to clipboard" />
</button>
Cut text from another element
Additionally, you can define a data-clipboard-action attribute to specify if you want to either copy or cut content.
If you omit this attribute, copy will be used by default.
<!-- Target -->
<textarea id="bar">Mussum ipsum cacilds...</textarea>
<!-- Trigger -->
<button class="btn" data-clipboard-action="cut" data-clipboard-target="#bar">
Cut to clipboard
</button>
As you may expect, the cut action only works on <input> or <textarea> elements.
Copy text from attribute
Truth is, you don't even need another element to copy its content from. You can just include a data-clipboard-text attribute in your trigger element.
<!-- Trigger -->
<button
class="btn"
data-clipboard-text="Just because you can doesn't mean you should — clipboard.js"
>
Copy to clipboard
</button>
Events
There are cases where you'd like to show some user feedback or capture what has been selected after a copy/cut operation.
That's why we fire custom events such as success and error for you to listen and implement your custom logic.
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);
});
For a live demonstration, go to this site and open your console.
Tooltips
Each application has different design needs, that's why clipboard.js does not include any CSS or built-in tooltip solution.
The tooltips you see on the demo site were built using GitHub's Primer. You may want to check that out if you're looking for a similar look and feel.
Advanced Options
If you don't want to modify your HTML, there's a pretty handy imperative API for you to use. All you need to do is declare a function, do your thing, and return a value.
For instance, if you want to dynamically set a target, you'll need to return a Node.
new ClipboardJS('.btn', {
target: function (trigger) {
return trigger.nextElementSibling;
},
});
If you want to dynamically set a text, you'll return a String.
new ClipboardJS('.btn', {
text: function (trigger) {
return trigger.getAttribute('aria-label');
},
});
For use in Bootstrap Modals or with any other library that changes the focus you'll want to set the focused element as the container value.
new ClipboardJS('.btn', {
container: document.getElementById('modal'),
});
Also, if you are working with single page apps, you may want to manage the lifecycle of the DOM more precisely. Here's how you clean up the events and objects that we create.
var clipboard = new ClipboardJS('.btn');
clipboard.destroy();
Browser Support
This library relies on both Selection and execCommand APIs. The first one is supported by all browsers while the second one is supported in the following browsers.
| 42+ ✔ | 12+ ✔ | 41+ ✔ | 9+ ✔ | 29+ ✔ | 10+ ✔ |
The good news is that clipboard.js gracefully degrades if you need to support older browsers. All you have to do is show a tooltip saying Copied! when success event is called and Press Ctrl+C to copy when error event is called because the text is already selected.
You can also check if clipboard.js is supported or not by running ClipboardJS.isSupported(), that way you can hide copy/cut buttons from the UI.
Bonus
A browser extension that adds a "copy to clipboard" button to every code block on GitHub, MDN, Gist, StackOverflow, StackExchange, npm, and even Medium.
Install for Chrome and Firefox.
License
MIT License © Zeno Rocha