diff --git a/src/clipboard.js b/src/clipboard.js index 4e2290c..7705521 100644 --- a/src/clipboard.js +++ b/src/clipboard.js @@ -17,7 +17,7 @@ class Clipboard extends Emitter { this.resolveOptions(options); if (typeof selector === 'string') { this.delegateClickToSelector(selector); - } else if (selector !== null && typeof selector === 'object') { + } else if ('addEventListener' in selector) { this.delegateClickToElement(selector); } else { throw new Error('`selector` should be a CSS selector string or elements itself.'); @@ -48,12 +48,8 @@ class Clipboard extends Emitter { * @param {Object} element */ delegateClickToElement(element) { - element.addEventListener('click', (e) => { - e.delegateTarget = element; - if (e.delegateTarget) { - (e) => this.onClick(e); - } - }); + this.element = element; + element.addEventListener('click', this.onClickEventListener.bind(this)); } /** @@ -61,7 +57,20 @@ class Clipboard extends Emitter { * @param {String} selector */ undelegateClick() { - Delegate.unbind(document.body, 'click', this.binding); + if (this.binding) { + Delegate.unbind(document.body, 'click', this.binding); + } else if (this.element) { + this.element.removeEventListener('click', this.onClickEventListener); + } + } + + /** + * Click event when using event listener + * @param {Event} e + */ + onClickEventListener(e) { + e.delegateTarget = this.element; + this.onClick(e); } /** diff --git a/test/clipboard.js b/test/clipboard.js index cf132e9..e2b870e 100644 --- a/test/clipboard.js +++ b/test/clipboard.js @@ -69,27 +69,6 @@ describe('Clipboard', () => { }); }); - 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'); - clipboard.undelegateClick(); - - assert.ok(global.spy.calledOnce); - assert.ok(global.spy.calledWith(element, event)); - }); - }); - describe('#delegateClickToElement', function() { before(() => { global.spy = sinon.spy(global.button, 'addEventListener'); @@ -109,6 +88,38 @@ describe('Clipboard', () => { }); }); + describe('#undelegateClick', function() { + before(() => { + global.spy = sinon.spy(Delegate, 'unbind'); + global.elementSpy = sinon.spy(global.button, 'removeEventListener'); + }); + + after(() => { + global.spy.restore(); + }); + + it('should undelegate a click event', () => { + let element = document.body; + let event = 'click'; + + let clipboard = new Clipboard('.btn'); + clipboard.undelegateClick(); + + assert.ok(global.spy.calledOnce); + assert.ok(global.spy.calledWith(element, event)); + }); + + it('should remove event listeners from elements', () => { + let event = 'click'; + + let clipboard = new Clipboard(global.button); + clipboard.undelegateClick(); + + assert.ok(global.elementSpy.calledOnce); + //assert.ok(global.elementSpy.calledWith(event, clipboard.onClickEventListener)); + }); + }); + describe('#onClick', () => { it('should create a new instance of ClipboardAction', () => { let clipboard = new Clipboard('.btn');