在使用 Clipboard.js 中学一点 JavaScript

在更新个人页面时,为方便快速复制邮箱地址,使用 Clipboard.js 一插件。之前未接触过 JavaScript,所以从零开始。 我的组合是:Bootstrap(CSS 框架)+ Clipboard.js

第一次报错:Uncaught TypeError: Illegal constructor #

new Clipboard('.btn');

一开始初始化调用 Clipboard.js 就出错?回到官方文档中比对:

new ClipboardJS('.btn');

问题解决。一开始所参照的中文教程比较久远,语句更新为 ClipboardJS

第二次报错:Uncaught TypeError: Cannot read property ‘addEventListener’ of null #

var clipboard = new ClipboardJS('.btn');

该语句是为了使用 DOM 选择器。

为什么在这里要使用 DOM 选择器(DOM SELECTOR) #

为了在页面上快速找到引号内(在此为.btn)元素,然后进行下一步。报错原因:调用 JavaScript 时,DOM 选择器还没有渲染完。反映为在使用 DOM 选择器时,没找到或没找完该元素。在我的页面中,因为一开始把<script></script>都放在<head>标签之内,所以在<body>没渲染之前就加载了 DOM 选择器,当然什么都找不到了。

问题解决:把该段 JS 放到到本来调用 Clipboard.js 那一段之后。

第三次报错:.tooltip() is not a function #

在正常调用 Clipboard.js 后,希望在点击复制后弹出复制成功或失败的提示语,而且 Bootstrap 集成了类似的 Tooltip.js 插件。在官方文档中找到相关代码:

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);
});

为了监听是否触发自定义事件,也就是获得用户是否成功复制内容的反馈,加载了这一段代码进行监听。如果成功,则回复 success,失败回复 error。结合 Tooltip.js 的教程,可以直接改为:

// Tooltip
 
$('button').tooltip({
  trigger: 'click',
  placement: 'bottom'
});
 
function setTooltip(message) {
  $('button').tooltip('hide')
    .attr('data-original-title', message)
    .tooltip('show');
}
 
function hideTooltip() {
  setTimeout(function() {
    $('button').tooltip('hide');
  }, 1000);
}
 
// Clipboard
 
var clipboard = new Clipboard('button');
 
clipboard.on('success', function(e) {
  setTooltip('Copied!');
  hideTooltip();
});
 
clipboard.on('error', function(e) {
  setTooltip('Failed!');
  hideTooltip();
});

在对应的按钮加入标签即可。但报错找不到 tooltip 的函数。应该还是加载问题。 问题解决:Tooltip.js 依赖 jQuery,需要先调用 jQuery 再调用 tooltip.js(也就是 bootstrap.min.js),在<head>内将调用 jquery.js 一行置于 bootstrap.min.js 之前。

到底学了什么? #

  1. 注意渲染顺序。
  2. 注意版本更新。

参考 #

Webmention this post, or contact me directly.

You can use Hypothes.is to select texts and highlight.

You've copied this page url!

Search it in your Mastodon server, and reply that toot by @fanrongbin.com@fanrongbin.com.