if called with element, remove event listener on undelegate

This commit is contained in:
arve0 2015-10-07 19:14:52 +02:00
parent 4cc0f7a77e
commit ce93b5e0f7
2 changed files with 49 additions and 29 deletions

View File

@ -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);
}
/**

View File

@ -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');