diff options
| author | ruki <waruqi@gmail.com> | 2018-11-08 00:38:48 +0800 |
|---|---|---|
| committer | ruki <waruqi@gmail.com> | 2018-11-07 21:53:09 +0800 |
| commit | 26105034da4fcce7ac883c899d781f016559310d (patch) | |
| tree | c459a5dc4e3aa0972d9919033ece511ce76dd129 /node_modules/delegate | |
| parent | 2c77f00f1a7ecb6c8192f9c16d3b2001b254a107 (diff) | |
| download | xmake-docs-26105034da4fcce7ac883c899d781f016559310d.tar.gz xmake-docs-26105034da4fcce7ac883c899d781f016559310d.zip | |
switch to vuepress
Diffstat (limited to 'node_modules/delegate')
| -rw-r--r-- | node_modules/delegate/.editorconfig | 22 | ||||
| -rw-r--r-- | node_modules/delegate/.travis.yml | 3 | ||||
| -rw-r--r-- | node_modules/delegate/demo/delegate.html | 29 | ||||
| -rw-r--r-- | node_modules/delegate/demo/multiple.html | 37 | ||||
| -rw-r--r-- | node_modules/delegate/demo/undelegate.html | 31 | ||||
| -rw-r--r-- | node_modules/delegate/dist/delegate.js | 80 | ||||
| -rw-r--r-- | node_modules/delegate/karma.conf.js | 24 | ||||
| -rw-r--r-- | node_modules/delegate/package.json | 31 | ||||
| -rw-r--r-- | node_modules/delegate/readme.md | 99 | ||||
| -rw-r--r-- | node_modules/delegate/src/closest.js | 33 | ||||
| -rw-r--r-- | node_modules/delegate/src/delegate.js | 78 | ||||
| -rw-r--r-- | node_modules/delegate/test/closest.js | 45 | ||||
| -rw-r--r-- | node_modules/delegate/test/delegate.js | 116 |
13 files changed, 628 insertions, 0 deletions
diff --git a/node_modules/delegate/.editorconfig b/node_modules/delegate/.editorconfig new file mode 100644 index 00000000..0f1d01bd --- /dev/null +++ b/node_modules/delegate/.editorconfig @@ -0,0 +1,22 @@ +# EditorConfig helps developers define and maintain consistent +# coding styles between different editors and IDEs +# http://editorconfig.org + +root = true + +[*] +# Change these settings to your own preference +indent_style = space +indent_size = 4 + +# We recommend you to keep these unchanged +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +[*.md] +trim_trailing_whitespace = false + +[{package.json,bower.json}] +indent_size = 2 diff --git a/node_modules/delegate/.travis.yml b/node_modules/delegate/.travis.yml new file mode 100644 index 00000000..833d09d1 --- /dev/null +++ b/node_modules/delegate/.travis.yml @@ -0,0 +1,3 @@ +language: node_js +node_js: + - stable diff --git a/node_modules/delegate/demo/delegate.html b/node_modules/delegate/demo/delegate.html new file mode 100644 index 00000000..3c099210 --- /dev/null +++ b/node_modules/delegate/demo/delegate.html @@ -0,0 +1,29 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8"> + <title>Delegate</title> +</head> +<body> + <!-- 1. Write some markup --> + <ul> + <li><button>Item 1</button></li> + <li><button>Item 2</button></li> + <li><button>Item 3</button></li> + <li><button>Item 4</button></li> + <li><button>Item 5</button></li> + </ul> + + <!-- 2. Include library --> + <script src="../dist/delegate.js"></script> + + <!-- 3. Add event delegation --> + <script> + var ul = document.querySelector('ul'); + + delegate(ul, 'button', 'click', function(e) { + console.log(e.target); + }); + </script> +</body> +</html> diff --git a/node_modules/delegate/demo/multiple.html b/node_modules/delegate/demo/multiple.html new file mode 100644 index 00000000..af6ca881 --- /dev/null +++ b/node_modules/delegate/demo/multiple.html @@ -0,0 +1,37 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8"> + <title>Delegate</title> +</head> +<body> + <!-- 1. Write some markup --> + <ul> + <li><button>Item 1</button></li> + <li><button>Item 2</button></li> + <li><button>Item 3</button></li> + <li><button>Item 4</button></li> + <li><button>Item 5</button></li> + </ul> + <ul> + <li><span>Item 6</span></li> + <li><span>Item 7</span></li> + </ul> + + <!-- 2. Include library --> + <script src="../dist/delegate.js"></script> + + <!-- 3. Add event delegation --> + <script> + var ul = document.querySelector('ul'); + + delegate(ul, 'button', 'click', function(e) { + console.log(e.target); + }); + + delegate(document.body, 'span', 'click', function(e) { + console.log(e.target); + }); + </script> +</body> +</html> diff --git a/node_modules/delegate/demo/undelegate.html b/node_modules/delegate/demo/undelegate.html new file mode 100644 index 00000000..60b59488 --- /dev/null +++ b/node_modules/delegate/demo/undelegate.html @@ -0,0 +1,31 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8"> + <title>Undelegate</title> +</head> +<body> + <!-- 1. Write some markup --> + <ul> + <li><button>Item 1</button></li> + <li><button>Item 2</button></li> + <li><button>Item 3</button></li> + <li><button>Item 4</button></li> + <li><button>Item 5</button></li> + </ul> + + <!-- 2. Include library --> + <script src="../dist/delegate.js"></script> + + <!-- 3. Remove event delegation --> + <script> + var ul = document.querySelector('ul'); + + var delegation = delegate(ul, 'li button', 'click', function(e) { + console.log(e.target); + }); + + delegation.destroy(); + </script> +</body> +</html> diff --git a/node_modules/delegate/dist/delegate.js b/node_modules/delegate/dist/delegate.js new file mode 100644 index 00000000..5763dfeb --- /dev/null +++ b/node_modules/delegate/dist/delegate.js @@ -0,0 +1,80 @@ +(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.delegate = 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){ +var DOCUMENT_NODE_TYPE = 9; + +/** + * A polyfill for Element.matches() + */ +if (typeof Element !== 'undefined' && !Element.prototype.matches) { + var proto = Element.prototype; + + proto.matches = proto.matchesSelector || + proto.mozMatchesSelector || + proto.msMatchesSelector || + proto.oMatchesSelector || + proto.webkitMatchesSelector; +} + +/** + * Finds the closest parent that matches a selector. + * + * @param {Element} element + * @param {String} selector + * @return {Function} + */ +function closest (element, selector) { + while (element && element.nodeType !== DOCUMENT_NODE_TYPE) { + if (element.matches(selector)) return element; + element = element.parentNode; + } +} + +module.exports = closest; + +},{}],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); + + if (e.delegateTarget) { + callback.call(element, e); + } + } +} + +module.exports = delegate; + +},{"./closest":1}]},{},[2])(2) +});
\ No newline at end of file diff --git a/node_modules/delegate/karma.conf.js b/node_modules/delegate/karma.conf.js new file mode 100644 index 00000000..62d108e5 --- /dev/null +++ b/node_modules/delegate/karma.conf.js @@ -0,0 +1,24 @@ +module.exports = function(karma) { + karma.set({ + plugins: ['karma-browserify', 'karma-chai', 'karma-sinon', 'karma-mocha', 'karma-phantomjs-launcher'], + + frameworks: ['browserify', 'chai', 'sinon', 'mocha'], + + files: [ + 'src/**/*.js', + 'test/**/*.js', + './node_modules/phantomjs-polyfill/bind-polyfill.js' + ], + + preprocessors: { + 'src/**/*.js' : ['browserify'], + 'test/**/*.js': ['browserify'] + }, + + browserify: { + debug: true + }, + + browsers: ['PhantomJS'] + }); +} diff --git a/node_modules/delegate/package.json b/node_modules/delegate/package.json new file mode 100644 index 00000000..08ad22a0 --- /dev/null +++ b/node_modules/delegate/package.json @@ -0,0 +1,31 @@ +{ + "name": "delegate", + "description": "Lightweight event delegation", + "version": "3.2.0", + "repository": "zenorocha/delegate", + "license": "MIT", + "main": "src/delegate.js", + "keywords": [ + "event", + "delegate", + "delegation" + ], + "devDependencies": { + "browserify": "^13.1.0", + "chai": "^3.5.0", + "karma": "^1.3.0", + "karma-browserify": "^5.1.0", + "karma-chai": "^0.1.0", + "karma-mocha": "^1.2.0", + "karma-phantomjs-launcher": "^1.0.2", + "karma-sinon": "^1.0.4", + "mocha": "^3.1.2", + "phantomjs-polyfill": "0.0.2", + "simulant": "^0.2.2", + "sinon": "^1.17.6" + }, + "scripts": { + "build": "browserify src/delegate.js -s delegate -o dist/delegate.js", + "test": "karma start --single-run" + } +} diff --git a/node_modules/delegate/readme.md b/node_modules/delegate/readme.md new file mode 100644 index 00000000..cae433a4 --- /dev/null +++ b/node_modules/delegate/readme.md @@ -0,0 +1,99 @@ +# delegate + +Lightweight event delegation. + +## Install + +You can get it on npm. + +``` +npm install delegate --save +``` + +If you're not into package management, just [download a ZIP](https://github.com/zenorocha/delegate/archive/master.zip) file. + +## Setup + +###### Node (Browserify) + +```js +var delegate = require('delegate'); +``` + +###### Browser (Standalone) + +```html +<script src="dist/delegate.js"></script> +``` + +## Usage + +### Add event delegation + +#### With the default base (`document`) + +```js +delegate('.btn', 'click', function(e) { + console.log(e.delegateTarget); +}, false); +``` + +#### With an element as base + +```js +delegate(document.body, '.btn', 'click', function(e) { + console.log(e.delegateTarget); +}, false); +``` + +#### With a selector (of existing elements) as base + +```js +delegate('.container', '.btn', 'click', function(e) { + console.log(e.delegateTarget); +}, false); +``` + +#### With an array/array-like of elements as base + +```js +delegate(document.querySelectorAll('.container'), '.btn', 'click', function(e) { + console.log(e.delegateTarget); +}, false); +``` + +### Remove event delegation + +#### With a single base element (default or specified) + +```js +var delegation = delegate(document.body, '.btn', 'click', function(e) { + console.log(e.delegateTarget); +}, false); + +delegation.destroy(); +``` + +#### With multiple elements (via selector or array) + +Note: selectors are always treated as multiple elements, even if one or none are matched. `delegate()` will return an array. + +```js +var delegations = delegate('.container', '.btn', 'click', function(e) { + console.log(e.delegateTarget); +}, false); + +delegations.forEach(function (delegation) { + delegation.destroy(); +}); +``` + +## Browser Support + +| <img src="https://clipboardjs.com/assets/images/chrome.png" width="48px" height="48px" alt="Chrome logo"> | <img src="https://clipboardjs.com/assets/images/edge.png" width="48px" height="48px" alt="Edge logo"> | <img src="https://clipboardjs.com/assets/images/firefox.png" width="48px" height="48px" alt="Firefox logo"> | <img src="https://clipboardjs.com/assets/images/ie.png" width="48px" height="48px" alt="Internet Explorer logo"> | <img src="https://clipboardjs.com/assets/images/opera.png" width="48px" height="48px" alt="Opera logo"> | <img src="https://clipboardjs.com/assets/images/safari.png" width="48px" height="48px" alt="Safari logo"> | +|:---:|:---:|:---:|:---:|:---:|:---:| +| Latest ✔ | Latest ✔ | Latest ✔ | 9+ ✔ | Latest ✔ | Latest ✔ | + +## License + +[MIT License](http://zenorocha.mit-license.org/) © Zeno Rocha diff --git a/node_modules/delegate/src/closest.js b/node_modules/delegate/src/closest.js new file mode 100644 index 00000000..842ea074 --- /dev/null +++ b/node_modules/delegate/src/closest.js @@ -0,0 +1,33 @@ +var DOCUMENT_NODE_TYPE = 9; + +/** + * A polyfill for Element.matches() + */ +if (typeof Element !== 'undefined' && !Element.prototype.matches) { + var proto = Element.prototype; + + proto.matches = proto.matchesSelector || + proto.mozMatchesSelector || + proto.msMatchesSelector || + proto.oMatchesSelector || + proto.webkitMatchesSelector; +} + +/** + * Finds the closest parent that matches a selector. + * + * @param {Element} element + * @param {String} selector + * @return {Function} + */ +function closest (element, selector) { + while (element && element.nodeType !== DOCUMENT_NODE_TYPE) { + if (typeof element.matches === 'function' && + element.matches(selector)) { + return element; + } + element = element.parentNode; + } +} + +module.exports = closest; diff --git a/node_modules/delegate/src/delegate.js b/node_modules/delegate/src/delegate.js new file mode 100644 index 00000000..9d9397d1 --- /dev/null +++ b/node_modules/delegate/src/delegate.js @@ -0,0 +1,78 @@ +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); + } + } +} + +/** + * Delegates event to a selector. + * + * @param {Element|String|Array} [elements] + * @param {String} selector + * @param {String} type + * @param {Function} callback + * @param {Boolean} useCapture + * @return {Object} + */ +function delegate(elements, selector, type, callback, useCapture) { + // Handle the regular Element usage + if (typeof elements.addEventListener === 'function') { + return _delegate.apply(null, arguments); + } + + // Handle Element-less usage, it defaults to global delegation + if (typeof type === 'function') { + // Use `document` as the first parameter, then apply arguments + // This is a short way to .unshift `arguments` without running into deoptimizations + return _delegate.bind(null, document).apply(null, arguments); + } + + // Handle Selector-based usage + if (typeof elements === 'string') { + elements = document.querySelectorAll(elements); + } + + // Handle Array-like based usage + return Array.prototype.map.call(elements, function (element) { + return _delegate(element, selector, type, callback, 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); + + if (e.delegateTarget) { + callback.call(element, e); + } + } +} + +module.exports = delegate; diff --git a/node_modules/delegate/test/closest.js b/node_modules/delegate/test/closest.js new file mode 100644 index 00000000..6a9e25f9 --- /dev/null +++ b/node_modules/delegate/test/closest.js @@ -0,0 +1,45 @@ +var closest = require('../src/closest'); + +describe('closest', function() { + before(function() { + var html = '<div id="a">' + + '<div id="b">' + + '<div id="c"></div>' + + '</div>' + + '</div>'; + + document.body.innerHTML += html; + + global.a = document.querySelector('#a'); + global.b = document.querySelector('#b'); + global.c = document.querySelector('#c'); + }); + + after(function() { + document.body.innerHTML = ''; + }); + + it('should return the closest parent based on the selector', function() { + assert.ok(closest(global.c, '#b'), global.b); + assert.ok(closest(global.c, '#a'), global.a); + assert.ok(closest(global.b, '#a'), global.a); + }); + + it('should return itself if the same selector is passed', function() { + assert.ok(closest(document.body, 'body'), document.body); + }); + + it('should not throw on elements without matches()', function() { + var fakeElement = { + nodeType: -1, // anything but DOCUMENT_NODE_TYPE + parentNode: null, + matches: undefined // undefined to emulate Elements without this function + }; + + try { + closest(fakeElement, '#a') + } catch (err) { + assert.fail(); + } + }); +}); diff --git a/node_modules/delegate/test/delegate.js b/node_modules/delegate/test/delegate.js new file mode 100644 index 00000000..669738f6 --- /dev/null +++ b/node_modules/delegate/test/delegate.js @@ -0,0 +1,116 @@ +var delegate = require('../src/delegate'); +var simulant = require('simulant'); + +describe('delegate', function() { + before(function() { + var html = '<ul>' + + '<li><a>Item 1</a></li>' + + '<li><a>Item 2</a></li>' + + '<li><a>Item 3</a></li>' + + '<li><a>Item 4</a></li>' + + '<li><a>Item 5</a></li>' + + '</ul>'; + + document.body.innerHTML += html; + + global.container = document.querySelector('ul'); + global.anchor = document.querySelector('a'); + + global.spy = sinon.spy(global.container, 'removeEventListener'); + }); + + after(function() { + global.spy.restore(); + document.body.innerHTML = ''; + }); + + it('should add an event listener', function(done) { + delegate(global.container, 'a', 'click', function() { + done(); + }); + + simulant.fire(global.anchor, simulant('click')); + }); + + it('should remove an event listener', function() { + var delegation = delegate(global.container, 'a', 'click', function() {}); + + delegation.destroy(); + assert.ok(global.spy.calledOnce); + }); + + it('should use `document` if the element is unspecified', function(done) { + delegate('a', 'click', function() { + done(); + }); + + simulant.fire(global.anchor, simulant('click')); + }); + + it('should remove an event listener the unspecified base (`document`)', function() { + var delegation = delegate('a', 'click', function() {}); + var spy = sinon.spy(document, 'removeEventListener'); + + delegation.destroy(); + assert.ok(spy.calledOnce); + + spy.restore(); + }); + + it('should add event listeners to all the elements in a base selector', function() { + var spy = sinon.spy(); + delegate('li', 'a', 'click', spy); + + var anchors = document.querySelectorAll('a'); + simulant.fire(anchors[0], simulant('click')); + simulant.fire(anchors[1], simulant('click')); + assert.ok(spy.calledTwice); + }); + + it('should remove the event listeners from all the elements in a base selector', function() { + var items = document.querySelectorAll('li') + var spies = Array.prototype.map.call(items, function (li) { + return sinon.spy(li, 'removeEventListener'); + }); + + var delegations = delegate('li', 'a', 'click', function() {}); + delegations.forEach(function (delegation) { + delegation.destroy(); + }); + + spies.every(function (spy) { + var success = spy.calledOnce; + spy.restore(); + return success; + }); + }); + + it('should add event listeners to all the elements in a base array', function() { + var spy = sinon.spy(); + var items = document.querySelectorAll('li') + delegate(items, 'a', 'click', spy); + + var anchors = document.querySelectorAll('a') + simulant.fire(anchors[0], simulant('click')); + simulant.fire(anchors[1], simulant('click')); + assert.ok(spy.calledTwice); + }); + + it('should remove the event listeners from all the elements in a base array', function() { + var items = document.querySelectorAll('li') + var spies = Array.prototype.map.call(items, function (li) { + return sinon.spy(li, 'removeEventListener'); + }); + + var delegations = delegate(items, 'a', 'click', function() {}); + delegations.forEach(function (delegation) { + delegation.destroy(); + }); + + spies.every(function (spy) { + var success = spy.calledOnce; + spy.restore(); + return success; + }); + }); +}); |
