mirror of
https://github.com/zenorocha/clipboard.js.git
synced 2023-08-10 21:12:48 +03:00
Compare commits
56 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a88bb77be4 | ||
|
|
e86dc2caa2 | ||
|
|
8392a7ba1c | ||
|
|
31e3622e17 | ||
|
|
ee1eb455f4 | ||
|
|
d50f2fb73f | ||
|
|
c8221c742d | ||
|
|
efc22cf651 | ||
|
|
4b27a72dce | ||
|
|
c12c610b22 | ||
|
|
1d772a0cbe | ||
|
|
d9254459b7 | ||
|
|
2aa163b1d0 | ||
|
|
783dc6f3cf | ||
|
|
3188ffbce3 | ||
|
|
5dba68634e | ||
|
|
a12a056ef6 | ||
|
|
cb4301658c | ||
|
|
5efcdf2810 | ||
|
|
72926580c3 | ||
|
|
4967f118fe | ||
|
|
44d59b34a2 | ||
|
|
9d6375d20e | ||
|
|
37136663df | ||
|
|
db575bb4df | ||
|
|
bb6c4c0e7c | ||
|
|
03ee9829e0 | ||
|
|
24f6e1f541 | ||
|
|
5bdfff6375 | ||
|
|
4b73122f81 | ||
|
|
171f438f22 | ||
|
|
42a459402c | ||
|
|
b26cdb3b41 | ||
|
|
57c7fcf9a4 | ||
|
|
6b1f6b22a6 | ||
|
|
705e2dbefd | ||
|
|
fd66d6b51f | ||
|
|
e0263beb20 | ||
|
|
4d734bc277 | ||
|
|
d5015f6313 | ||
|
|
7e5beb439a | ||
|
|
70b2548a80 | ||
|
|
c6dc01cc29 | ||
|
|
f0245ab701 | ||
|
|
c911ba0f53 | ||
|
|
d166ff6d96 | ||
|
|
f7da00f0ba | ||
|
|
c7c2d9fb4f | ||
|
|
9fb666b365 | ||
|
|
9ddd3a8017 | ||
|
|
8d804fdd42 | ||
|
|
54efeb68e6 | ||
|
|
f56825bf73 | ||
|
|
9377659c9c | ||
|
|
5e43e84d91 | ||
|
|
6ca2ba514c |
6
.banner
Normal file
6
.banner
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
/*!
|
||||||
|
* clipboard.js v<%= pkg.version %>
|
||||||
|
* https://zenorocha.github.io/clipboard.js
|
||||||
|
*
|
||||||
|
* Licensed MIT © Zeno Rocha
|
||||||
|
*/
|
||||||
@@ -17,3 +17,6 @@ insert_final_newline = true
|
|||||||
|
|
||||||
[*.md]
|
[*.md]
|
||||||
trim_trailing_whitespace = false
|
trim_trailing_whitespace = false
|
||||||
|
|
||||||
|
[{package.json,bower.json}]
|
||||||
|
indent_size = 2
|
||||||
|
|||||||
1
.gitignore
vendored
1
.gitignore
vendored
@@ -1,3 +1,4 @@
|
|||||||
|
lib
|
||||||
npm-debug.log
|
npm-debug.log
|
||||||
bower_components
|
bower_components
|
||||||
node_modules
|
node_modules
|
||||||
|
|||||||
7
.npmignore
Normal file
7
.npmignore
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
/.*/
|
||||||
|
/demo/
|
||||||
|
/test/
|
||||||
|
/.*
|
||||||
|
/bower.json
|
||||||
|
/karma.conf.js
|
||||||
|
/src
|
||||||
@@ -1,3 +1,4 @@
|
|||||||
|
sudo: false
|
||||||
language: node_js
|
language: node_js
|
||||||
node_js:
|
node_js:
|
||||||
- 0.12
|
- stable
|
||||||
|
|||||||
12
bower.json
12
bower.json
@@ -1,9 +1,19 @@
|
|||||||
{
|
{
|
||||||
"name": "clipboard",
|
"name": "clipboard",
|
||||||
"version": "1.4.1",
|
"version": "1.5.7",
|
||||||
"description": "Modern copy to clipboard. No Flash. Just 2kb",
|
"description": "Modern copy to clipboard. No Flash. Just 2kb",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"main": "dist/clipboard.js",
|
"main": "dist/clipboard.js",
|
||||||
|
"ignore": [
|
||||||
|
"/.*/",
|
||||||
|
"/demo/",
|
||||||
|
"/test/",
|
||||||
|
"/.*",
|
||||||
|
"/bower.json",
|
||||||
|
"/karma.conf.js",
|
||||||
|
"/src",
|
||||||
|
"/lib"
|
||||||
|
],
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"clipboard",
|
"clipboard",
|
||||||
"copy",
|
"copy",
|
||||||
|
|||||||
30
demo/constructor-node.html
Normal file
30
demo/constructor-node.html
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>constructor-node</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<!-- 1. Define some markup -->
|
||||||
|
<div id="btn" data-clipboard-text="1">
|
||||||
|
<span>Copy</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- 2. Include library -->
|
||||||
|
<script src="../dist/clipboard.min.js"></script>
|
||||||
|
|
||||||
|
<!-- 3. Instantiate clipboard by passing a HTML element -->
|
||||||
|
<script>
|
||||||
|
var btn = document.getElementById('btn');
|
||||||
|
var clipboard = new Clipboard(btn);
|
||||||
|
|
||||||
|
clipboard.on('success', function(e) {
|
||||||
|
console.log(e);
|
||||||
|
});
|
||||||
|
|
||||||
|
clipboard.on('error', function(e) {
|
||||||
|
console.log(e);
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
30
demo/constructor-nodelist.html
Normal file
30
demo/constructor-nodelist.html
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>constructor-nodelist</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<!-- 1. Define some markup -->
|
||||||
|
<button data-clipboard-text="1">Copy</button>
|
||||||
|
<button data-clipboard-text="2">Copy</button>
|
||||||
|
<button data-clipboard-text="3">Copy</button>
|
||||||
|
|
||||||
|
<!-- 2. Include library -->
|
||||||
|
<script src="../dist/clipboard.min.js"></script>
|
||||||
|
|
||||||
|
<!-- 3. Instantiate clipboard by passing a list of HTML elements -->
|
||||||
|
<script>
|
||||||
|
var btns = document.querySelectorAll('button');
|
||||||
|
var clipboard = new Clipboard(btns);
|
||||||
|
|
||||||
|
clipboard.on('success', function(e) {
|
||||||
|
console.log(e);
|
||||||
|
});
|
||||||
|
|
||||||
|
clipboard.on('error', function(e) {
|
||||||
|
console.log(e);
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
29
demo/constructor-selector.html
Normal file
29
demo/constructor-selector.html
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>constructor-selector</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<!-- 1. Define some markup -->
|
||||||
|
<button class="btn" data-clipboard-text="1">Copy</button>
|
||||||
|
<button class="btn" data-clipboard-text="2">Copy</button>
|
||||||
|
<button class="btn" data-clipboard-text="3">Copy</button>
|
||||||
|
|
||||||
|
<!-- 2. Include library -->
|
||||||
|
<script src="../dist/clipboard.min.js"></script>
|
||||||
|
|
||||||
|
<!-- 3. Instantiate clipboard by passing a string selector -->
|
||||||
|
<script>
|
||||||
|
var clipboard = new Clipboard('.btn');
|
||||||
|
|
||||||
|
clipboard.on('success', function(e) {
|
||||||
|
console.log(e);
|
||||||
|
});
|
||||||
|
|
||||||
|
clipboard.on('error', function(e) {
|
||||||
|
console.log(e);
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
32
demo/function-target.html
Normal file
32
demo/function-target.html
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>function-target</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<!-- 1. Define some markup -->
|
||||||
|
<button class="btn">Copy</button>
|
||||||
|
<div>hello</div>
|
||||||
|
|
||||||
|
<!-- 2. Include library -->
|
||||||
|
<script src="../dist/clipboard.min.js"></script>
|
||||||
|
|
||||||
|
<!-- 3. Instantiate clipboard -->
|
||||||
|
<script>
|
||||||
|
var clipboard = new Clipboard('.btn', {
|
||||||
|
target: function() {
|
||||||
|
return document.querySelector('div');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
clipboard.on('success', function(e) {
|
||||||
|
console.log(e);
|
||||||
|
});
|
||||||
|
|
||||||
|
clipboard.on('error', function(e) {
|
||||||
|
console.log(e);
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
31
demo/function-text.html
Normal file
31
demo/function-text.html
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>function-text</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<!-- 1. Define some markup -->
|
||||||
|
<button class="btn">Copy</button>
|
||||||
|
|
||||||
|
<!-- 2. Include library -->
|
||||||
|
<script src="../dist/clipboard.min.js"></script>
|
||||||
|
|
||||||
|
<!-- 3. Instantiate clipboard -->
|
||||||
|
<script>
|
||||||
|
var clipboard = new Clipboard('.btn', {
|
||||||
|
text: function() {
|
||||||
|
return 'to be or not to be';
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
clipboard.on('success', function(e) {
|
||||||
|
console.log(e);
|
||||||
|
});
|
||||||
|
|
||||||
|
clipboard.on('error', function(e) {
|
||||||
|
console.log(e);
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
28
demo/target-div.html
Normal file
28
demo/target-div.html
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>target-div</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<!-- 1. Define some markup -->
|
||||||
|
<div>hello</div>
|
||||||
|
<button class="btn" data-clipboard-action="copy" data-clipboard-target="div">Copy</button>
|
||||||
|
|
||||||
|
<!-- 2. Include library -->
|
||||||
|
<script src="../dist/clipboard.min.js"></script>
|
||||||
|
|
||||||
|
<!-- 3. Instantiate clipboard -->
|
||||||
|
<script>
|
||||||
|
var clipboard = new Clipboard('.btn');
|
||||||
|
|
||||||
|
clipboard.on('success', function(e) {
|
||||||
|
console.log(e);
|
||||||
|
});
|
||||||
|
|
||||||
|
clipboard.on('error', function(e) {
|
||||||
|
console.log(e);
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
28
demo/target-input.html
Normal file
28
demo/target-input.html
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>target-input</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<!-- 1. Define some markup -->
|
||||||
|
<input id="foo" type="text" value="hello">
|
||||||
|
<button class="btn" data-clipboard-action="copy" data-clipboard-target="#foo">Copy</button>
|
||||||
|
|
||||||
|
<!-- 2. Include library -->
|
||||||
|
<script src="../dist/clipboard.min.js"></script>
|
||||||
|
|
||||||
|
<!-- 3. Instantiate clipboard -->
|
||||||
|
<script>
|
||||||
|
var clipboard = new Clipboard('.btn');
|
||||||
|
|
||||||
|
clipboard.on('success', function(e) {
|
||||||
|
console.log(e);
|
||||||
|
});
|
||||||
|
|
||||||
|
clipboard.on('error', function(e) {
|
||||||
|
console.log(e);
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
28
demo/target-textarea.html
Normal file
28
demo/target-textarea.html
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>target-textarea</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<!-- 1. Define some markup -->
|
||||||
|
<textarea id="bar">hello</textarea>
|
||||||
|
<button class="btn" data-clipboard-action="cut" data-clipboard-target="#bar">Cut</button>
|
||||||
|
|
||||||
|
<!-- 2. Include library -->
|
||||||
|
<script src="../dist/clipboard.min.js"></script>
|
||||||
|
|
||||||
|
<!-- 3. Instantiate clipboard -->
|
||||||
|
<script>
|
||||||
|
var clipboard = new Clipboard('.btn');
|
||||||
|
|
||||||
|
clipboard.on('success', function(e) {
|
||||||
|
console.log(e);
|
||||||
|
});
|
||||||
|
|
||||||
|
clipboard.on('error', function(e) {
|
||||||
|
console.log(e);
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
433
dist/clipboard.js
vendored
433
dist/clipboard.js
vendored
@@ -1,56 +1,10 @@
|
|||||||
|
/*!
|
||||||
|
* clipboard.js v1.5.7
|
||||||
|
* https://zenorocha.github.io/clipboard.js
|
||||||
|
*
|
||||||
|
* Licensed MIT © Zeno Rocha
|
||||||
|
*/
|
||||||
(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.Clipboard = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
|
(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.Clipboard = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
|
||||||
/**
|
|
||||||
* Module dependencies.
|
|
||||||
*/
|
|
||||||
|
|
||||||
var closest = require('closest')
|
|
||||||
, event = require('component-event');
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Delegate event `type` to `selector`
|
|
||||||
* and invoke `fn(e)`. A callback function
|
|
||||||
* is returned which may be passed to `.unbind()`.
|
|
||||||
*
|
|
||||||
* @param {Element} el
|
|
||||||
* @param {String} selector
|
|
||||||
* @param {String} type
|
|
||||||
* @param {Function} fn
|
|
||||||
* @param {Boolean} capture
|
|
||||||
* @return {Function}
|
|
||||||
* @api public
|
|
||||||
*/
|
|
||||||
|
|
||||||
// Some events don't bubble, so we want to bind to the capture phase instead
|
|
||||||
// when delegating.
|
|
||||||
var forceCaptureEvents = ['focus', 'blur'];
|
|
||||||
|
|
||||||
exports.bind = function(el, selector, type, fn, capture){
|
|
||||||
if (forceCaptureEvents.indexOf(type) !== -1) capture = true;
|
|
||||||
|
|
||||||
return event.bind(el, type, function(e){
|
|
||||||
var target = e.target || e.srcElement;
|
|
||||||
e.delegateTarget = closest(target, selector, true, el);
|
|
||||||
if (e.delegateTarget) fn.call(el, e);
|
|
||||||
}, capture);
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Unbind event `type`'s callback `fn`.
|
|
||||||
*
|
|
||||||
* @param {Element} el
|
|
||||||
* @param {String} type
|
|
||||||
* @param {Function} fn
|
|
||||||
* @param {Boolean} capture
|
|
||||||
* @api public
|
|
||||||
*/
|
|
||||||
|
|
||||||
exports.unbind = function(el, type, fn, capture){
|
|
||||||
if (forceCaptureEvents.indexOf(type) !== -1) capture = true;
|
|
||||||
|
|
||||||
event.unbind(el, type, fn, capture);
|
|
||||||
};
|
|
||||||
|
|
||||||
},{"closest":2,"component-event":4}],2:[function(require,module,exports){
|
|
||||||
var matches = require('matches-selector')
|
var matches = require('matches-selector')
|
||||||
|
|
||||||
module.exports = function (element, selector, checkYoSelf) {
|
module.exports = function (element, selector, checkYoSelf) {
|
||||||
@@ -62,7 +16,201 @@ module.exports = function (element, selector, checkYoSelf) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
},{"matches-selector":3}],3:[function(require,module,exports){
|
},{"matches-selector":5}],2:[function(require,module,exports){
|
||||||
|
var closest = require('closest');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Delegates event to a selector.
|
||||||
|
*
|
||||||
|
* @param {Element} element
|
||||||
|
* @param {String} selector
|
||||||
|
* @param {String} type
|
||||||
|
* @param {Function} callback
|
||||||
|
* @param {Boolean} useCapture
|
||||||
|
* @return {Object}
|
||||||
|
*/
|
||||||
|
function delegate(element, selector, type, callback, useCapture) {
|
||||||
|
var listenerFn = listener.apply(this, arguments);
|
||||||
|
|
||||||
|
element.addEventListener(type, listenerFn, useCapture);
|
||||||
|
|
||||||
|
return {
|
||||||
|
destroy: function() {
|
||||||
|
element.removeEventListener(type, listenerFn, useCapture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Finds closest match and invokes callback.
|
||||||
|
*
|
||||||
|
* @param {Element} element
|
||||||
|
* @param {String} selector
|
||||||
|
* @param {String} type
|
||||||
|
* @param {Function} callback
|
||||||
|
* @return {Function}
|
||||||
|
*/
|
||||||
|
function listener(element, selector, type, callback) {
|
||||||
|
return function(e) {
|
||||||
|
e.delegateTarget = closest(e.target, selector, true);
|
||||||
|
|
||||||
|
if (e.delegateTarget) {
|
||||||
|
callback.call(element, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = delegate;
|
||||||
|
|
||||||
|
},{"closest":1}],3:[function(require,module,exports){
|
||||||
|
/**
|
||||||
|
* Check if argument is a HTML element.
|
||||||
|
*
|
||||||
|
* @param {Object} value
|
||||||
|
* @return {Boolean}
|
||||||
|
*/
|
||||||
|
exports.node = function(value) {
|
||||||
|
return value !== undefined
|
||||||
|
&& value instanceof HTMLElement
|
||||||
|
&& value.nodeType === 1;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if argument is a list of HTML elements.
|
||||||
|
*
|
||||||
|
* @param {Object} value
|
||||||
|
* @return {Boolean}
|
||||||
|
*/
|
||||||
|
exports.nodeList = function(value) {
|
||||||
|
var type = Object.prototype.toString.call(value);
|
||||||
|
|
||||||
|
return value !== undefined
|
||||||
|
&& (type === '[object NodeList]' || type === '[object HTMLCollection]')
|
||||||
|
&& ('length' in value)
|
||||||
|
&& (value.length === 0 || exports.node(value[0]));
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if argument is a string.
|
||||||
|
*
|
||||||
|
* @param {Object} value
|
||||||
|
* @return {Boolean}
|
||||||
|
*/
|
||||||
|
exports.string = function(value) {
|
||||||
|
return typeof value === 'string'
|
||||||
|
|| value instanceof String;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if argument is a function.
|
||||||
|
*
|
||||||
|
* @param {Object} value
|
||||||
|
* @return {Boolean}
|
||||||
|
*/
|
||||||
|
exports.fn = function(value) {
|
||||||
|
var type = Object.prototype.toString.call(value);
|
||||||
|
|
||||||
|
return type === '[object Function]';
|
||||||
|
};
|
||||||
|
|
||||||
|
},{}],4:[function(require,module,exports){
|
||||||
|
var is = require('./is');
|
||||||
|
var delegate = require('delegate');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Validates all params and calls the right
|
||||||
|
* listener function based on its target type.
|
||||||
|
*
|
||||||
|
* @param {String|HTMLElement|HTMLCollection|NodeList} target
|
||||||
|
* @param {String} type
|
||||||
|
* @param {Function} callback
|
||||||
|
* @return {Object}
|
||||||
|
*/
|
||||||
|
function listen(target, type, callback) {
|
||||||
|
if (!target && !type && !callback) {
|
||||||
|
throw new Error('Missing required arguments');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!is.string(type)) {
|
||||||
|
throw new TypeError('Second argument must be a String');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!is.fn(callback)) {
|
||||||
|
throw new TypeError('Third argument must be a Function');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is.node(target)) {
|
||||||
|
return listenNode(target, type, callback);
|
||||||
|
}
|
||||||
|
else if (is.nodeList(target)) {
|
||||||
|
return listenNodeList(target, type, callback);
|
||||||
|
}
|
||||||
|
else if (is.string(target)) {
|
||||||
|
return listenSelector(target, type, callback);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
throw new TypeError('First argument must be a String, HTMLElement, HTMLCollection, or NodeList');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds an event listener to a HTML element
|
||||||
|
* and returns a remove listener function.
|
||||||
|
*
|
||||||
|
* @param {HTMLElement} node
|
||||||
|
* @param {String} type
|
||||||
|
* @param {Function} callback
|
||||||
|
* @return {Object}
|
||||||
|
*/
|
||||||
|
function listenNode(node, type, callback) {
|
||||||
|
node.addEventListener(type, callback);
|
||||||
|
|
||||||
|
return {
|
||||||
|
destroy: function() {
|
||||||
|
node.removeEventListener(type, callback);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add an event listener to a list of HTML elements
|
||||||
|
* and returns a remove listener function.
|
||||||
|
*
|
||||||
|
* @param {NodeList|HTMLCollection} nodeList
|
||||||
|
* @param {String} type
|
||||||
|
* @param {Function} callback
|
||||||
|
* @return {Object}
|
||||||
|
*/
|
||||||
|
function listenNodeList(nodeList, type, callback) {
|
||||||
|
Array.prototype.forEach.call(nodeList, function(node) {
|
||||||
|
node.addEventListener(type, callback);
|
||||||
|
});
|
||||||
|
|
||||||
|
return {
|
||||||
|
destroy: function() {
|
||||||
|
Array.prototype.forEach.call(nodeList, function(node) {
|
||||||
|
node.removeEventListener(type, callback);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add an event listener to a selector
|
||||||
|
* and returns a remove listener function.
|
||||||
|
*
|
||||||
|
* @param {String} selector
|
||||||
|
* @param {String} type
|
||||||
|
* @param {Function} callback
|
||||||
|
* @return {Object}
|
||||||
|
*/
|
||||||
|
function listenSelector(selector, type, callback) {
|
||||||
|
return delegate(document.body, selector, type, callback);
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = listen;
|
||||||
|
|
||||||
|
},{"./is":3,"delegate":2}],5:[function(require,module,exports){
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Element prototype.
|
* Element prototype.
|
||||||
@@ -103,43 +251,37 @@ function match(el, selector) {
|
|||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
},{}],4:[function(require,module,exports){
|
},{}],6:[function(require,module,exports){
|
||||||
var bind = window.addEventListener ? 'addEventListener' : 'attachEvent',
|
function select(element) {
|
||||||
unbind = window.removeEventListener ? 'removeEventListener' : 'detachEvent',
|
var selectedText;
|
||||||
prefix = bind !== 'addEventListener' ? 'on' : '';
|
|
||||||
|
|
||||||
/**
|
if (element.nodeName === 'INPUT' || element.nodeName === 'TEXTAREA') {
|
||||||
* Bind `el` event `type` to `fn`.
|
element.focus();
|
||||||
*
|
element.setSelectionRange(0, element.value.length);
|
||||||
* @param {Element} el
|
|
||||||
* @param {String} type
|
|
||||||
* @param {Function} fn
|
|
||||||
* @param {Boolean} capture
|
|
||||||
* @return {Function}
|
|
||||||
* @api public
|
|
||||||
*/
|
|
||||||
|
|
||||||
exports.bind = function(el, type, fn, capture){
|
selectedText = element.value;
|
||||||
el[bind](prefix + type, fn, capture || false);
|
}
|
||||||
return fn;
|
else {
|
||||||
};
|
if (element.hasAttribute('contenteditable')) {
|
||||||
|
element.focus();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
var selection = window.getSelection();
|
||||||
* Unbind `el` event `type`'s callback `fn`.
|
var range = document.createRange();
|
||||||
*
|
|
||||||
* @param {Element} el
|
|
||||||
* @param {String} type
|
|
||||||
* @param {Function} fn
|
|
||||||
* @param {Boolean} capture
|
|
||||||
* @return {Function}
|
|
||||||
* @api public
|
|
||||||
*/
|
|
||||||
|
|
||||||
exports.unbind = function(el, type, fn, capture){
|
range.selectNodeContents(element);
|
||||||
el[unbind](prefix + type, fn, capture || false);
|
selection.removeAllRanges();
|
||||||
return fn;
|
selection.addRange(range);
|
||||||
};
|
|
||||||
},{}],5:[function(require,module,exports){
|
selectedText = selection.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
return selectedText;
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = select;
|
||||||
|
|
||||||
|
},{}],7:[function(require,module,exports){
|
||||||
function E () {
|
function E () {
|
||||||
// Keep this empty so it's easier to inherit from
|
// Keep this empty so it's easier to inherit from
|
||||||
// (via https://github.com/lipsmack from https://github.com/scottcorgan/tiny-emitter/issues/3)
|
// (via https://github.com/lipsmack from https://github.com/scottcorgan/tiny-emitter/issues/3)
|
||||||
@@ -148,23 +290,24 @@ function E () {
|
|||||||
E.prototype = {
|
E.prototype = {
|
||||||
on: function (name, callback, ctx) {
|
on: function (name, callback, ctx) {
|
||||||
var e = this.e || (this.e = {});
|
var e = this.e || (this.e = {});
|
||||||
|
|
||||||
(e[name] || (e[name] = [])).push({
|
(e[name] || (e[name] = [])).push({
|
||||||
fn: callback,
|
fn: callback,
|
||||||
ctx: ctx
|
ctx: ctx
|
||||||
});
|
});
|
||||||
|
|
||||||
return this;
|
return this;
|
||||||
},
|
},
|
||||||
|
|
||||||
once: function (name, callback, ctx) {
|
once: function (name, callback, ctx) {
|
||||||
var self = this;
|
var self = this;
|
||||||
var fn = function () {
|
function listener () {
|
||||||
self.off(name, fn);
|
self.off(name, listener);
|
||||||
callback.apply(ctx, arguments);
|
callback.apply(ctx, arguments);
|
||||||
};
|
};
|
||||||
|
|
||||||
return this.on(name, fn, ctx);
|
listener._ = callback
|
||||||
|
return this.on(name, listener, ctx);
|
||||||
},
|
},
|
||||||
|
|
||||||
emit: function (name) {
|
emit: function (name) {
|
||||||
@@ -172,11 +315,11 @@ E.prototype = {
|
|||||||
var evtArr = ((this.e || (this.e = {}))[name] || []).slice();
|
var evtArr = ((this.e || (this.e = {}))[name] || []).slice();
|
||||||
var i = 0;
|
var i = 0;
|
||||||
var len = evtArr.length;
|
var len = evtArr.length;
|
||||||
|
|
||||||
for (i; i < len; i++) {
|
for (i; i < len; i++) {
|
||||||
evtArr[i].fn.apply(evtArr[i].ctx, data);
|
evtArr[i].fn.apply(evtArr[i].ctx, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
return this;
|
return this;
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -184,40 +327,48 @@ E.prototype = {
|
|||||||
var e = this.e || (this.e = {});
|
var e = this.e || (this.e = {});
|
||||||
var evts = e[name];
|
var evts = e[name];
|
||||||
var liveEvents = [];
|
var liveEvents = [];
|
||||||
|
|
||||||
if (evts && callback) {
|
if (evts && callback) {
|
||||||
for (var i = 0, len = evts.length; i < len; i++) {
|
for (var i = 0, len = evts.length; i < len; i++) {
|
||||||
if (evts[i].fn !== callback) liveEvents.push(evts[i]);
|
if (evts[i].fn !== callback && evts[i].fn._ !== callback)
|
||||||
|
liveEvents.push(evts[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Remove event from queue to prevent memory leak
|
// Remove event from queue to prevent memory leak
|
||||||
// Suggested by https://github.com/lazd
|
// Suggested by https://github.com/lazd
|
||||||
// Ref: https://github.com/scottcorgan/tiny-emitter/commit/c6ebfaa9bc973b33d110a84a307742b7cf94c953#commitcomment-5024910
|
// Ref: https://github.com/scottcorgan/tiny-emitter/commit/c6ebfaa9bc973b33d110a84a307742b7cf94c953#commitcomment-5024910
|
||||||
|
|
||||||
(liveEvents.length)
|
(liveEvents.length)
|
||||||
? e[name] = liveEvents
|
? e[name] = liveEvents
|
||||||
: delete e[name];
|
: delete e[name];
|
||||||
|
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
module.exports = E;
|
module.exports = E;
|
||||||
|
|
||||||
},{}],6:[function(require,module,exports){
|
},{}],8:[function(require,module,exports){
|
||||||
/**
|
|
||||||
* Inner class which performs selection from either `text` or `target`
|
|
||||||
* properties and then executes copy or cut operations.
|
|
||||||
*/
|
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
exports.__esModule = true;
|
exports.__esModule = true;
|
||||||
|
|
||||||
var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
|
var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
|
||||||
|
|
||||||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
|
||||||
|
|
||||||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
|
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
|
||||||
|
|
||||||
|
var _select = require('select');
|
||||||
|
|
||||||
|
var _select2 = _interopRequireDefault(_select);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Inner class which performs selection from either `text` or `target`
|
||||||
|
* properties and then executes copy or cut operations.
|
||||||
|
*/
|
||||||
|
|
||||||
var ClipboardAction = (function () {
|
var ClipboardAction = (function () {
|
||||||
/**
|
/**
|
||||||
* @param {Object} options
|
* @param {Object} options
|
||||||
@@ -272,6 +423,8 @@ var ClipboardAction = (function () {
|
|||||||
ClipboardAction.prototype.selectFake = function selectFake() {
|
ClipboardAction.prototype.selectFake = function selectFake() {
|
||||||
var _this = this;
|
var _this = this;
|
||||||
|
|
||||||
|
var isRTL = document.documentElement.getAttribute('dir') == 'rtl';
|
||||||
|
|
||||||
this.removeFake();
|
this.removeFake();
|
||||||
|
|
||||||
this.fakeHandler = document.body.addEventListener('click', function () {
|
this.fakeHandler = document.body.addEventListener('click', function () {
|
||||||
@@ -280,21 +433,20 @@ var ClipboardAction = (function () {
|
|||||||
|
|
||||||
this.fakeElem = document.createElement('textarea');
|
this.fakeElem = document.createElement('textarea');
|
||||||
this.fakeElem.style.position = 'absolute';
|
this.fakeElem.style.position = 'absolute';
|
||||||
this.fakeElem.style.left = '-9999px';
|
this.fakeElem.style[isRTL ? 'right' : 'left'] = '-9999px';
|
||||||
this.fakeElem.style.top = (window.pageYOffset || document.documentElement.scrollTop) + 'px';
|
this.fakeElem.style.top = (window.pageYOffset || document.documentElement.scrollTop) + 'px';
|
||||||
this.fakeElem.setAttribute('readonly', '');
|
this.fakeElem.setAttribute('readonly', '');
|
||||||
this.fakeElem.value = this.text;
|
this.fakeElem.value = this.text;
|
||||||
this.selectedText = this.text;
|
|
||||||
|
|
||||||
document.body.appendChild(this.fakeElem);
|
document.body.appendChild(this.fakeElem);
|
||||||
|
|
||||||
this.fakeElem.select();
|
this.selectedText = _select2['default'](this.fakeElem);
|
||||||
this.copyText();
|
this.copyText();
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Only removes the fake element after another click event, that way
|
* Only removes the fake element after another click event, that way
|
||||||
* an user can hit `Ctrl+C` to copy because selection still exists.
|
* a user can hit `Ctrl+C` to copy because selection still exists.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
ClipboardAction.prototype.removeFake = function removeFake() {
|
ClipboardAction.prototype.removeFake = function removeFake() {
|
||||||
@@ -314,18 +466,7 @@ var ClipboardAction = (function () {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
ClipboardAction.prototype.selectTarget = function selectTarget() {
|
ClipboardAction.prototype.selectTarget = function selectTarget() {
|
||||||
if (this.target.nodeName === 'INPUT' || this.target.nodeName === 'TEXTAREA') {
|
this.selectedText = _select2['default'](this.target);
|
||||||
this.target.select();
|
|
||||||
this.selectedText = this.target.value;
|
|
||||||
} else {
|
|
||||||
var range = document.createRange();
|
|
||||||
var selection = window.getSelection();
|
|
||||||
|
|
||||||
range.selectNodeContents(this.target);
|
|
||||||
selection.addRange(range);
|
|
||||||
this.selectedText = selection.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
this.copyText();
|
this.copyText();
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -444,7 +585,7 @@ var ClipboardAction = (function () {
|
|||||||
exports['default'] = ClipboardAction;
|
exports['default'] = ClipboardAction;
|
||||||
module.exports = exports['default'];
|
module.exports = exports['default'];
|
||||||
|
|
||||||
},{}],7:[function(require,module,exports){
|
},{"select":6}],9:[function(require,module,exports){
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
exports.__esModule = true;
|
exports.__esModule = true;
|
||||||
@@ -459,16 +600,16 @@ var _clipboardAction = require('./clipboard-action');
|
|||||||
|
|
||||||
var _clipboardAction2 = _interopRequireDefault(_clipboardAction);
|
var _clipboardAction2 = _interopRequireDefault(_clipboardAction);
|
||||||
|
|
||||||
var _delegateEvents = require('delegate-events');
|
|
||||||
|
|
||||||
var _delegateEvents2 = _interopRequireDefault(_delegateEvents);
|
|
||||||
|
|
||||||
var _tinyEmitter = require('tiny-emitter');
|
var _tinyEmitter = require('tiny-emitter');
|
||||||
|
|
||||||
var _tinyEmitter2 = _interopRequireDefault(_tinyEmitter);
|
var _tinyEmitter2 = _interopRequireDefault(_tinyEmitter);
|
||||||
|
|
||||||
|
var _goodListener = require('good-listener');
|
||||||
|
|
||||||
|
var _goodListener2 = _interopRequireDefault(_goodListener);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Base class which takes a selector, delegates a click event to it,
|
* Base class which takes one or more elements, adds event listeners to them,
|
||||||
* and instantiates a new `ClipboardAction` on each click.
|
* and instantiates a new `ClipboardAction` on each click.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -476,17 +617,17 @@ var Clipboard = (function (_Emitter) {
|
|||||||
_inherits(Clipboard, _Emitter);
|
_inherits(Clipboard, _Emitter);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {String} selector
|
* @param {String|HTMLElement|HTMLCollection|NodeList} trigger
|
||||||
* @param {Object} options
|
* @param {Object} options
|
||||||
*/
|
*/
|
||||||
|
|
||||||
function Clipboard(selector, options) {
|
function Clipboard(trigger, options) {
|
||||||
_classCallCheck(this, Clipboard);
|
_classCallCheck(this, Clipboard);
|
||||||
|
|
||||||
_Emitter.call(this);
|
_Emitter.call(this);
|
||||||
|
|
||||||
this.resolveOptions(options);
|
this.resolveOptions(options);
|
||||||
this.delegateClick(selector);
|
this.listenClick(trigger);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -510,42 +651,35 @@ var Clipboard = (function (_Emitter) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Delegates a click event on the passed selector.
|
* Adds a click event listener to the passed trigger.
|
||||||
* @param {String} selector
|
* @param {String|HTMLElement|HTMLCollection|NodeList} trigger
|
||||||
*/
|
*/
|
||||||
|
|
||||||
Clipboard.prototype.delegateClick = function delegateClick(selector) {
|
Clipboard.prototype.listenClick = function listenClick(trigger) {
|
||||||
var _this = this;
|
var _this = this;
|
||||||
|
|
||||||
this.binding = _delegateEvents2['default'].bind(document.body, selector, 'click', function (e) {
|
this.listener = _goodListener2['default'](trigger, 'click', function (e) {
|
||||||
return _this.onClick(e);
|
return _this.onClick(e);
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
|
||||||
* Undelegates a click event on body.
|
|
||||||
* @param {String} selector
|
|
||||||
*/
|
|
||||||
|
|
||||||
Clipboard.prototype.undelegateClick = function undelegateClick() {
|
|
||||||
_delegateEvents2['default'].unbind(document.body, 'click', this.binding);
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Defines a new `ClipboardAction` on each click event.
|
* Defines a new `ClipboardAction` on each click event.
|
||||||
* @param {Event} e
|
* @param {Event} e
|
||||||
*/
|
*/
|
||||||
|
|
||||||
Clipboard.prototype.onClick = function onClick(e) {
|
Clipboard.prototype.onClick = function onClick(e) {
|
||||||
|
var trigger = e.delegateTarget || e.currentTarget;
|
||||||
|
|
||||||
if (this.clipboardAction) {
|
if (this.clipboardAction) {
|
||||||
this.clipboardAction = null;
|
this.clipboardAction = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.clipboardAction = new _clipboardAction2['default']({
|
this.clipboardAction = new _clipboardAction2['default']({
|
||||||
action: this.action(e.delegateTarget),
|
action: this.action(trigger),
|
||||||
target: this.target(e.delegateTarget),
|
target: this.target(trigger),
|
||||||
text: this.text(e.delegateTarget),
|
text: this.text(trigger),
|
||||||
trigger: e.delegateTarget,
|
trigger: trigger,
|
||||||
emitter: this
|
emitter: this
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
@@ -586,7 +720,7 @@ var Clipboard = (function (_Emitter) {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
Clipboard.prototype.destroy = function destroy() {
|
Clipboard.prototype.destroy = function destroy() {
|
||||||
this.undelegateClick();
|
this.listener.destroy();
|
||||||
|
|
||||||
if (this.clipboardAction) {
|
if (this.clipboardAction) {
|
||||||
this.clipboardAction.destroy();
|
this.clipboardAction.destroy();
|
||||||
@@ -597,6 +731,7 @@ var Clipboard = (function (_Emitter) {
|
|||||||
return Clipboard;
|
return Clipboard;
|
||||||
})(_tinyEmitter2['default']);
|
})(_tinyEmitter2['default']);
|
||||||
|
|
||||||
|
exports['default'] = Clipboard;
|
||||||
function getAttributeValue(suffix, element) {
|
function getAttributeValue(suffix, element) {
|
||||||
var attribute = 'data-clipboard-' + suffix;
|
var attribute = 'data-clipboard-' + suffix;
|
||||||
|
|
||||||
@@ -606,9 +741,7 @@ function getAttributeValue(suffix, element) {
|
|||||||
|
|
||||||
return element.getAttribute(attribute);
|
return element.getAttribute(attribute);
|
||||||
}
|
}
|
||||||
|
|
||||||
exports['default'] = Clipboard;
|
|
||||||
module.exports = exports['default'];
|
module.exports = exports['default'];
|
||||||
|
|
||||||
},{"./clipboard-action":6,"delegate-events":1,"tiny-emitter":5}]},{},[7])(7)
|
},{"./clipboard-action":8,"good-listener":4,"tiny-emitter":7}]},{},[9])(9)
|
||||||
});
|
});
|
||||||
8
dist/clipboard.min.js
vendored
8
dist/clipboard.min.js
vendored
File diff suppressed because one or more lines are too long
12
package.js
Normal file
12
package.js
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
// Package metadata for Meteor.js.
|
||||||
|
|
||||||
|
Package.describe({
|
||||||
|
name: "zenorocha:clipboard",
|
||||||
|
summary: "Modern copy to clipboard. No Flash. Just 2kb.",
|
||||||
|
version: "1.5.7",
|
||||||
|
git: "https://github.com/zenorocha/clipboard.js"
|
||||||
|
});
|
||||||
|
|
||||||
|
Package.onUse(function(api) {
|
||||||
|
api.addFiles("dist/clipboard.js", "client");
|
||||||
|
});
|
||||||
40
package.json
40
package.json
@@ -1,33 +1,26 @@
|
|||||||
{
|
{
|
||||||
"name": "clipboard",
|
"name": "clipboard",
|
||||||
"version": "1.4.1",
|
"version": "1.5.7",
|
||||||
"description": "Modern copy to clipboard. No Flash. Just 2kb",
|
"description": "Modern copy to clipboard. No Flash. Just 2kb",
|
||||||
"repository": "zenorocha/clipboard.js",
|
"repository": "zenorocha/clipboard.js",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"main": "dist/clipboard.js",
|
"main": "lib/clipboard.js",
|
||||||
"browser": "src/clipboard.js",
|
|
||||||
"browserify": {
|
|
||||||
"transform": [
|
|
||||||
[
|
|
||||||
"babelify",
|
|
||||||
{
|
|
||||||
"loose": "all"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"clipboard",
|
"clipboard",
|
||||||
"copy",
|
"copy",
|
||||||
"cut"
|
"cut"
|
||||||
],
|
],
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"babelify": "^6.3.0",
|
"good-listener": "^1.1.6",
|
||||||
"browserify": "^11.2.0",
|
"select": "^1.0.6",
|
||||||
"delegate-events": "^1.1.1",
|
|
||||||
"tiny-emitter": "^1.0.0"
|
"tiny-emitter": "^1.0.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
"babel": "^5.8.29",
|
||||||
|
"babelify": "^6.3.0",
|
||||||
|
"bannerify": "Vekat/bannerify#feature-option",
|
||||||
|
"browserify": "^11.2.0",
|
||||||
|
"chai": "^3.4.1",
|
||||||
"karma": "^0.13.10",
|
"karma": "^0.13.10",
|
||||||
"karma-browserify": "^4.4.0",
|
"karma-browserify": "^4.4.0",
|
||||||
"karma-chai": "^0.1.0",
|
"karma-chai": "^0.1.0",
|
||||||
@@ -35,17 +28,18 @@
|
|||||||
"karma-phantomjs-launcher": "^0.2.1",
|
"karma-phantomjs-launcher": "^0.2.1",
|
||||||
"karma-sinon": "^1.0.4",
|
"karma-sinon": "^1.0.4",
|
||||||
"mocha": "^2.3.3",
|
"mocha": "^2.3.3",
|
||||||
|
"phantomjs": "^1.9.18",
|
||||||
"phantomjs-polyfill": "0.0.1",
|
"phantomjs-polyfill": "0.0.1",
|
||||||
"uglify": "^0.1.5",
|
"sinon": "^1.17.2",
|
||||||
|
"uglify-js": "^2.4.24",
|
||||||
"watchify": "^3.4.0"
|
"watchify": "^3.4.0"
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"build": "npm run build-debug && npm run build-min",
|
"build": "npm run build-debug && npm run build-min",
|
||||||
"build-debug": "browserify src/clipboard.js -s Clipboard -o dist/clipboard.js",
|
"build-debug": "browserify src/clipboard.js -s Clipboard -t [babelify --loose all] -p [bannerify --file .banner ] -o dist/clipboard.js",
|
||||||
"build-min": "uglify -s dist/clipboard.js -o dist/clipboard.min.js",
|
"build-min": "uglifyjs dist/clipboard.js --comments '/!/' -m screw_ie8=true -c screw_ie8=true,unused=false -o dist/clipboard.min.js",
|
||||||
"build-watch": "watchify src/clipboard.js -s Clipboard -o dist/clipboard.js -v",
|
"build-watch": "watchify src/clipboard.js -s Clipboard -t [babelify --loose all] -o dist/clipboard.js -v",
|
||||||
"test": "npm run test-browser && npm run test-server",
|
"test": "karma start --single-run",
|
||||||
"test-browser": "karma start --single-run",
|
"prepublish": "babel src --out-dir lib --loose all"
|
||||||
"test-server": "mocha test/module-systems.js"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
27
readme.md
27
readme.md
@@ -1,10 +1,11 @@
|
|||||||
# clipboard.js
|
# clipboard.js
|
||||||
|
|
||||||
[](https://travis-ci.org/zenorocha/clipboard.js)
|
[](https://travis-ci.org/zenorocha/clipboard.js)
|
||||||
|

|
||||||
|
|
||||||
> Modern copy to clipboard. No Flash. Just 2kb
|
> Modern copy to clipboard. No Flash. Just 2kb
|
||||||
|
|
||||||
<a href="https://zenorocha.github.io/clipboard.js/"><img width="728" src="https://cloud.githubusercontent.com/assets/398893/9983535/5ab0a950-5fb4-11e5-9602-e73c0b661883.jpg" alt="Demo"></a>
|
<a href="http://clipboardjs.com/"><img width="728" src="https://cloud.githubusercontent.com/assets/398893/9983535/5ab0a950-5fb4-11e5-9602-e73c0b661883.jpg" alt="Demo"></a>
|
||||||
|
|
||||||
## Why
|
## Why
|
||||||
|
|
||||||
@@ -30,19 +31,13 @@ If you're not into package management, just [download a ZIP](https://github.com/
|
|||||||
|
|
||||||
## Setup
|
## Setup
|
||||||
|
|
||||||
First, include the script located on the `dist` folder.
|
First, include the script located on the `dist` folder or load it from [a third-party CDN provider](https://github.com/zenorocha/clipboard.js/wiki/CDN-Providers).
|
||||||
|
|
||||||
```html
|
```html
|
||||||
<script src="dist/clipboard.min.js"></script>
|
<script src="dist/clipboard.min.js"></script>
|
||||||
```
|
```
|
||||||
|
|
||||||
Or load it from a CDN.
|
Now, you need to instantiate it by [passing a DOM selector](https://github.com/zenorocha/clipboard.js/blob/master/demo/constructor-selector.html#L18), [HTML element](https://github.com/zenorocha/clipboard.js/blob/master/demo/constructor-node.html#L16-L17), or [list of HTML elements](https://github.com/zenorocha/clipboard.js/blob/master/demo/constructor-nodelist.html#L18-L19).
|
||||||
|
|
||||||
```html
|
|
||||||
<script src="https://cdn.rawgit.com/zenorocha/clipboard.js/master/dist/clipboard.min.js"></script>
|
|
||||||
```
|
|
||||||
|
|
||||||
Now, you need to instantiate it using a DOM selector. This selector corresponds to the trigger element(s), for example `<button class="btn">`.
|
|
||||||
|
|
||||||
```js
|
```js
|
||||||
new Clipboard('.btn');
|
new Clipboard('.btn');
|
||||||
@@ -62,7 +57,7 @@ A pretty common use case is to copy content from another element. You can do tha
|
|||||||
|
|
||||||
The value you include on this attribute needs to match another's element selector.
|
The value you include on this attribute needs to match another's element selector.
|
||||||
|
|
||||||
<a href="https://zenorocha.github.io/clipboard.js/#example-target"><img width="473" alt="example-2" src="https://cloud.githubusercontent.com/assets/398893/9983467/a4946aaa-5fb1-11e5-9780-f09fcd7ca6c8.png"></a>
|
<a href="http://clipboardjs.com/#example-target"><img width="473" alt="example-2" src="https://cloud.githubusercontent.com/assets/398893/9983467/a4946aaa-5fb1-11e5-9780-f09fcd7ca6c8.png"></a>
|
||||||
|
|
||||||
```html
|
```html
|
||||||
<!-- Target -->
|
<!-- Target -->
|
||||||
@@ -80,7 +75,7 @@ Additionally, you can define a `data-clipboard-action` attribute to specify if y
|
|||||||
|
|
||||||
If you omit this attribute, `copy` will be used by default.
|
If you omit this attribute, `copy` will be used by default.
|
||||||
|
|
||||||
<a href="https://zenorocha.github.io/clipboard.js/#example-action"><img width="473" alt="example-3" src="https://cloud.githubusercontent.com/assets/398893/10000358/7df57b9c-6050-11e5-9cd1-fbc51d2fd0a7.png"></a>
|
<a href="http://clipboardjs.com/#example-action"><img width="473" alt="example-3" src="https://cloud.githubusercontent.com/assets/398893/10000358/7df57b9c-6050-11e5-9cd1-fbc51d2fd0a7.png"></a>
|
||||||
|
|
||||||
```html
|
```html
|
||||||
<!-- Target -->
|
<!-- Target -->
|
||||||
@@ -98,7 +93,7 @@ As you may expect, the `cut` action only works on `<input>` or `<textarea>` elem
|
|||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
<a href="https://zenorocha.github.io/clipboard.js/#example-text"><img width="147" alt="example-1" src="https://cloud.githubusercontent.com/assets/398893/10000347/6e16cf8c-6050-11e5-9883-1c5681f9ec45.png"></a>
|
<a href="http://clipboardjs.com/#example-text"><img width="147" alt="example-1" src="https://cloud.githubusercontent.com/assets/398893/10000347/6e16cf8c-6050-11e5-9883-1c5681f9ec45.png"></a>
|
||||||
|
|
||||||
```html
|
```html
|
||||||
<!-- Trigger -->
|
<!-- Trigger -->
|
||||||
@@ -130,7 +125,7 @@ clipboard.on('error', function(e) {
|
|||||||
});
|
});
|
||||||
```
|
```
|
||||||
|
|
||||||
For a live demonstration, open this [site](https://zenorocha.github.io/clipboard.js/) and just your console :)
|
For a live demonstration, open this [site](http://clipboardjs.com/) and just your console :)
|
||||||
|
|
||||||
## Advanced Options
|
## Advanced Options
|
||||||
|
|
||||||
@@ -156,7 +151,7 @@ new Clipboard('.btn', {
|
|||||||
});
|
});
|
||||||
```
|
```
|
||||||
|
|
||||||
Also, with 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.
|
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.
|
||||||
|
|
||||||
```js
|
```js
|
||||||
var clipboard = new Clipboard('.btn');
|
var clipboard = new Clipboard('.btn');
|
||||||
@@ -167,7 +162,7 @@ clipboard.destroy();
|
|||||||
|
|
||||||
This library relies on both [Selection](https://developer.mozilla.org/en-US/docs/Web/API/Selection) and [execCommand](https://developer.mozilla.org/en-US/docs/Web/API/Document/execCommand) APIs. The second one is supported in the following browsers.
|
This library relies on both [Selection](https://developer.mozilla.org/en-US/docs/Web/API/Selection) and [execCommand](https://developer.mozilla.org/en-US/docs/Web/API/Document/execCommand) APIs. The second one is supported in the following browsers.
|
||||||
|
|
||||||
| <img src="https://zenorocha.github.io/clipboard.js/assets/images/chrome.png" width="48px" height="48px" alt="Chrome logo"> | <img src="https://zenorocha.github.io/clipboard.js/assets/images/firefox.png" width="48px" height="48px" alt="Firefox logo"> | <img src="https://zenorocha.github.io/clipboard.js/assets/images/ie.png" width="48px" height="48px" alt="Internet Explorer logo"> | <img src="https://zenorocha.github.io/clipboard.js/assets/images/opera.png" width="48px" height="48px" alt="Opera logo"> | <img src="https://zenorocha.github.io/clipboard.js/assets/images/safari.png" width="48px" height="48px" alt="Safari logo"> |
|
| <img src="http://clipboardjs.com/assets/images/chrome.png" width="48px" height="48px" alt="Chrome logo"> | <img src="http://clipboardjs.com/assets/images/firefox.png" width="48px" height="48px" alt="Firefox logo"> | <img src="http://clipboardjs.com/assets/images/ie.png" width="48px" height="48px" alt="Internet Explorer logo"> | <img src="http://clipboardjs.com/assets/images/opera.png" width="48px" height="48px" alt="Opera logo"> | <img src="http://clipboardjs.com/assets/images/safari.png" width="48px" height="48px" alt="Safari logo"> |
|
||||||
|:---:|:---:|:---:|:---:|:---:|
|
|:---:|:---:|:---:|:---:|:---:|
|
||||||
| 42+ ✔ | 41+ ✔ | 9+ ✔ | 29+ ✔ | Nope ✘ |
|
| 42+ ✔ | 41+ ✔ | 9+ ✔ | 29+ ✔ | Nope ✘ |
|
||||||
|
|
||||||
@@ -175,7 +170,7 @@ Although copy/cut operations with [execCommand](https://developer.mozilla.org/en
|
|||||||
|
|
||||||
That means you can 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.
|
That means you can 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.
|
||||||
|
|
||||||
For a live demonstration, open this [site](https://zenorocha.github.io/clipboard.js/) on Safari.
|
For a live demonstration, open this [site](http://clipboardjs.com) on Safari.
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +1,10 @@
|
|||||||
|
import select from 'select';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Inner class which performs selection from either `text` or `target`
|
* Inner class which performs selection from either `text` or `target`
|
||||||
* properties and then executes copy or cut operations.
|
* properties and then executes copy or cut operations.
|
||||||
*/
|
*/
|
||||||
class ClipboardAction {
|
export default class ClipboardAction {
|
||||||
/**
|
/**
|
||||||
* @param {Object} options
|
* @param {Object} options
|
||||||
*/
|
*/
|
||||||
@@ -49,27 +51,28 @@ class ClipboardAction {
|
|||||||
* and makes a selection on it.
|
* and makes a selection on it.
|
||||||
*/
|
*/
|
||||||
selectFake() {
|
selectFake() {
|
||||||
|
let isRTL = document.documentElement.getAttribute('dir') == 'rtl';
|
||||||
|
|
||||||
this.removeFake();
|
this.removeFake();
|
||||||
|
|
||||||
this.fakeHandler = document.body.addEventListener('click', () => this.removeFake());
|
this.fakeHandler = document.body.addEventListener('click', () => this.removeFake());
|
||||||
|
|
||||||
this.fakeElem = document.createElement('textarea');
|
this.fakeElem = document.createElement('textarea');
|
||||||
this.fakeElem.style.position = 'absolute';
|
this.fakeElem.style.position = 'absolute';
|
||||||
this.fakeElem.style.left = '-9999px';
|
this.fakeElem.style[ isRTL ? 'right' : 'left' ] = '-9999px';
|
||||||
this.fakeElem.style.top = (window.pageYOffset || document.documentElement.scrollTop) + 'px';
|
this.fakeElem.style.top = (window.pageYOffset || document.documentElement.scrollTop) + 'px';
|
||||||
this.fakeElem.setAttribute('readonly', '');
|
this.fakeElem.setAttribute('readonly', '');
|
||||||
this.fakeElem.value = this.text;
|
this.fakeElem.value = this.text;
|
||||||
this.selectedText = this.text;
|
|
||||||
|
|
||||||
document.body.appendChild(this.fakeElem);
|
document.body.appendChild(this.fakeElem);
|
||||||
|
|
||||||
this.fakeElem.select();
|
this.selectedText = select(this.fakeElem);
|
||||||
this.copyText();
|
this.copyText();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Only removes the fake element after another click event, that way
|
* Only removes the fake element after another click event, that way
|
||||||
* an user can hit `Ctrl+C` to copy because selection still exists.
|
* a user can hit `Ctrl+C` to copy because selection still exists.
|
||||||
*/
|
*/
|
||||||
removeFake() {
|
removeFake() {
|
||||||
if (this.fakeHandler) {
|
if (this.fakeHandler) {
|
||||||
@@ -87,19 +90,7 @@ class ClipboardAction {
|
|||||||
* Selects the content from element passed on `target` property.
|
* Selects the content from element passed on `target` property.
|
||||||
*/
|
*/
|
||||||
selectTarget() {
|
selectTarget() {
|
||||||
if (this.target.nodeName === 'INPUT' || this.target.nodeName === 'TEXTAREA') {
|
this.selectedText = select(this.target);
|
||||||
this.target.select();
|
|
||||||
this.selectedText = this.target.value;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
let range = document.createRange();
|
|
||||||
let selection = window.getSelection();
|
|
||||||
|
|
||||||
range.selectNodeContents(this.target);
|
|
||||||
selection.addRange(range);
|
|
||||||
this.selectedText = selection.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
this.copyText();
|
this.copyText();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -203,5 +194,3 @@ class ClipboardAction {
|
|||||||
this.removeFake();
|
this.removeFake();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export default ClipboardAction;
|
|
||||||
|
|||||||
@@ -1,21 +1,21 @@
|
|||||||
import ClipboardAction from './clipboard-action';
|
import ClipboardAction from './clipboard-action';
|
||||||
import Delegate from 'delegate-events';
|
|
||||||
import Emitter from 'tiny-emitter';
|
import Emitter from 'tiny-emitter';
|
||||||
|
import listen from 'good-listener';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Base class which takes a selector, delegates a click event to it,
|
* Base class which takes one or more elements, adds event listeners to them,
|
||||||
* and instantiates a new `ClipboardAction` on each click.
|
* and instantiates a new `ClipboardAction` on each click.
|
||||||
*/
|
*/
|
||||||
class Clipboard extends Emitter {
|
export default class Clipboard extends Emitter {
|
||||||
/**
|
/**
|
||||||
* @param {String} selector
|
* @param {String|HTMLElement|HTMLCollection|NodeList} trigger
|
||||||
* @param {Object} options
|
* @param {Object} options
|
||||||
*/
|
*/
|
||||||
constructor(selector, options) {
|
constructor(trigger, options) {
|
||||||
super();
|
super();
|
||||||
|
|
||||||
this.resolveOptions(options);
|
this.resolveOptions(options);
|
||||||
this.delegateClick(selector);
|
this.listenClick(trigger);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -30,19 +30,11 @@ class Clipboard extends Emitter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Delegates a click event on the passed selector.
|
* Adds a click event listener to the passed trigger.
|
||||||
* @param {String} selector
|
* @param {String|HTMLElement|HTMLCollection|NodeList} trigger
|
||||||
*/
|
*/
|
||||||
delegateClick(selector) {
|
listenClick(trigger) {
|
||||||
this.binding = Delegate.bind(document.body, selector, 'click', (e) => this.onClick(e));
|
this.listener = listen(trigger, 'click', (e) => this.onClick(e));
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Undelegates a click event on body.
|
|
||||||
* @param {String} selector
|
|
||||||
*/
|
|
||||||
undelegateClick() {
|
|
||||||
Delegate.unbind(document.body, 'click', this.binding);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -50,15 +42,17 @@ class Clipboard extends Emitter {
|
|||||||
* @param {Event} e
|
* @param {Event} e
|
||||||
*/
|
*/
|
||||||
onClick(e) {
|
onClick(e) {
|
||||||
|
let trigger = e.delegateTarget || e.currentTarget;
|
||||||
|
|
||||||
if (this.clipboardAction) {
|
if (this.clipboardAction) {
|
||||||
this.clipboardAction = null;
|
this.clipboardAction = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.clipboardAction = new ClipboardAction({
|
this.clipboardAction = new ClipboardAction({
|
||||||
action : this.action(e.delegateTarget),
|
action : this.action(trigger),
|
||||||
target : this.target(e.delegateTarget),
|
target : this.target(trigger),
|
||||||
text : this.text(e.delegateTarget),
|
text : this.text(trigger),
|
||||||
trigger : e.delegateTarget,
|
trigger : trigger,
|
||||||
emitter : this
|
emitter : this
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -95,7 +89,7 @@ class Clipboard extends Emitter {
|
|||||||
* Destroy lifecycle.
|
* Destroy lifecycle.
|
||||||
*/
|
*/
|
||||||
destroy() {
|
destroy() {
|
||||||
this.undelegateClick();
|
this.listener.destroy();
|
||||||
|
|
||||||
if (this.clipboardAction) {
|
if (this.clipboardAction) {
|
||||||
this.clipboardAction.destroy();
|
this.clipboardAction.destroy();
|
||||||
@@ -119,5 +113,3 @@ function getAttributeValue(suffix, element) {
|
|||||||
|
|
||||||
return element.getAttribute(attribute);
|
return element.getAttribute(attribute);
|
||||||
}
|
}
|
||||||
|
|
||||||
export default Clipboard;
|
|
||||||
|
|||||||
@@ -57,6 +57,19 @@ describe('ClipboardAction', () => {
|
|||||||
done();
|
done();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should set the position right style property', done => {
|
||||||
|
// Set document direction
|
||||||
|
document.documentElement.setAttribute('dir', 'rtl');
|
||||||
|
|
||||||
|
let clip = new ClipboardAction({
|
||||||
|
emitter: new Emitter(),
|
||||||
|
text: 'foo'
|
||||||
|
});
|
||||||
|
|
||||||
|
assert.equal(clip.fakeElem.style.right, '-9999px');
|
||||||
|
done();
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('#set action', () => {
|
describe('#set action', () => {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import Clipboard from '../src/clipboard';
|
import Clipboard from '../src/clipboard';
|
||||||
import ClipboardAction from '../src/clipboard-action';
|
import ClipboardAction from '../src/clipboard-action';
|
||||||
import Delegate from 'delegate-events';
|
import listen from 'good-listener';
|
||||||
|
|
||||||
describe('Clipboard', () => {
|
describe('Clipboard', () => {
|
||||||
before(() => {
|
before(() => {
|
||||||
@@ -9,8 +9,14 @@ describe('Clipboard', () => {
|
|||||||
global.button.setAttribute('data-clipboard-text', 'foo');
|
global.button.setAttribute('data-clipboard-text', 'foo');
|
||||||
document.body.appendChild(global.button);
|
document.body.appendChild(global.button);
|
||||||
|
|
||||||
|
global.span = document.createElement('span');
|
||||||
|
global.span.innerHTML = 'bar';
|
||||||
|
|
||||||
|
global.button.appendChild(span);
|
||||||
|
|
||||||
global.event = {
|
global.event = {
|
||||||
delegateTarget: global.button
|
target: global.button,
|
||||||
|
currentTarget: global.button
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -18,7 +24,7 @@ describe('Clipboard', () => {
|
|||||||
document.body.innerHTML = '';
|
document.body.innerHTML = '';
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('#resolveOptions', function() {
|
describe('#resolveOptions', () => {
|
||||||
before(() => {
|
before(() => {
|
||||||
global.fn = function() {};
|
global.fn = function() {};
|
||||||
});
|
});
|
||||||
@@ -48,45 +54,10 @@ describe('Clipboard', () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('#delegateClick', function() {
|
describe('#listenClick', () => {
|
||||||
before(() => {
|
it('should add a click event listener to the passed selector', () => {
|
||||||
global.spy = sinon.spy(Delegate, 'bind');
|
|
||||||
});
|
|
||||||
|
|
||||||
after(() => {
|
|
||||||
global.spy.restore();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should delegate a click event to the passed selector', () => {
|
|
||||||
let element = document.body;
|
|
||||||
let selector = '.btn';
|
|
||||||
let event = 'click';
|
|
||||||
|
|
||||||
let clipboard = new Clipboard(selector);
|
|
||||||
|
|
||||||
assert.ok(global.spy.calledOnce);
|
|
||||||
assert.ok(global.spy.calledWith(element, selector, event));
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('#undelegateClick', function() {
|
|
||||||
before(() => {
|
|
||||||
global.spy = sinon.spy(Delegate, 'unbind');
|
|
||||||
});
|
|
||||||
|
|
||||||
after(() => {
|
|
||||||
global.spy.restore();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should undelegate a click event', () => {
|
|
||||||
let element = document.body;
|
|
||||||
let event = 'click';
|
|
||||||
|
|
||||||
let clipboard = new Clipboard('.btn');
|
let clipboard = new Clipboard('.btn');
|
||||||
clipboard.undelegateClick();
|
assert.isObject(clipboard.listener);
|
||||||
|
|
||||||
assert.ok(global.spy.calledOnce);
|
|
||||||
assert.ok(global.spy.calledWith(element, event));
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -98,13 +69,22 @@ describe('Clipboard', () => {
|
|||||||
assert.instanceOf(clipboard.clipboardAction, ClipboardAction);
|
assert.instanceOf(clipboard.clipboardAction, ClipboardAction);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should throws exception target', done => {
|
it('should use an event\'s currentTarget when not equal to target', () => {
|
||||||
|
let clipboard = new Clipboard('.btn');
|
||||||
|
let bubbledEvent = { target: global.span, currentTarget: global.button };
|
||||||
|
|
||||||
|
clipboard.onClick(bubbledEvent);
|
||||||
|
assert.instanceOf(clipboard.clipboardAction, ClipboardAction);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should throw an exception when target is invalid', done => {
|
||||||
try {
|
try {
|
||||||
var clipboard = new Clipboard('.btn', {
|
var clipboard = new Clipboard('.btn', {
|
||||||
target: function() {
|
target: function() {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
clipboard.onClick(global.event);
|
clipboard.onClick(global.event);
|
||||||
}
|
}
|
||||||
catch(e) {
|
catch(e) {
|
||||||
|
|||||||
@@ -1,15 +0,0 @@
|
|||||||
var assert = require('chai').assert;
|
|
||||||
var browserify = require('browserify');
|
|
||||||
|
|
||||||
describe('CommonJS', function() {
|
|
||||||
it('should import the lib in a commonjs env without babel', function(done) {
|
|
||||||
browserify('./dist/clipboard.js').bundle(function(err) {
|
|
||||||
assert.equal(err, null);
|
|
||||||
done();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('AMD', function() {
|
|
||||||
// TODO: Write test case
|
|
||||||
});
|
|
||||||
Reference in New Issue
Block a user