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