Skip to content

Commit 468729e

Browse files
committed
Fix dispatchEvent(). Fixes #17 and #18.
1 parent 92c9808 commit 468729e

File tree

3 files changed

+37
-7
lines changed

3 files changed

+37
-7
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
/dist
22
/node_modules
33
/npm-debug.log
4+
package-lock.json
45
.DS_Store

src/undom.js

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -140,16 +140,19 @@ export default function undom() {
140140
splice(this.__handlers[toLower(type)], handler, 0, true);
141141
}
142142
dispatchEvent(event) {
143-
let t = event.currentTarget = this,
143+
let t = event.target = this,
144144
c = event.cancelable,
145145
l, i;
146146
do {
147+
event.currentTarget = t;
147148
l = t.__handlers && t.__handlers[toLower(event.type)];
148149
if (l) for (i=l.length; i--; ) {
149-
if ((l[i].call(t, event)===false || event._end) && c) break;
150+
if ((l[i].call(t, event) === false || event._end) && c) {
151+
event.defaultPrevented = true;
152+
}
150153
}
151-
} while (event.bubbles && !(c && event._stop) && (event.target=t=t.parentNode));
152-
return !event.defaultPrevented;
154+
} while (event.bubbles && !(c && event._stop) && (t=t.parentNode));
155+
return l!=null;
153156
}
154157
}
155158

@@ -164,8 +167,8 @@ export default function undom() {
164167
class Event {
165168
constructor(type, opts) {
166169
this.type = type;
167-
this.bubbles = !!opts.bubbles;
168-
this.cancelable = !!opts.cancelable;
170+
this.bubbles = !!(opts && opts.bubbles);
171+
this.cancelable = !!(opts && opts.cancelable);
169172
}
170173
stopPropagation() {
171174
this._stop = true;

test/undom.js

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -240,7 +240,7 @@ describe('undom', () => {
240240
});
241241

242242
it('should bubble if enabled', () => {
243-
let event = { type:'foo', cancelable:true, bubbles:true };
243+
let event = new document.defaultView.Event('foo', { cancelable:true, bubbles:true });
244244
let child = document.createElement('div');
245245
let parent = document.createElement('div');
246246
parent.appendChild(child);
@@ -264,6 +264,32 @@ describe('undom', () => {
264264
child.dispatchEvent(event);
265265
expect(parent.fn).not.to.have.been.called;
266266
});
267+
268+
it('should return `found`', () => {
269+
let el = document.createElement('div');
270+
let el2 = document.createElement('div');
271+
el.addEventListener('foo', () => {});
272+
273+
expect(el.dispatchEvent(new document.defaultView.Event('foo'))).to.equal(true);
274+
expect(el2.dispatchEvent(new document.defaultView.Event('foo'))).to.equal(false);
275+
});
276+
277+
it('preventDefault() should set defaultPrevented', () => {
278+
let event = new document.defaultView.Event('foo', { cancelable: true, bubbles: true });
279+
let el = document.createElement('div');
280+
let parent = document.createElement('div');
281+
parent.appendChild(el);
282+
let fn = spy(e => { e.preventDefault(); });
283+
let parentFn = spy(e => { e.preventDefault(); });
284+
el.addEventListener('foo', fn);
285+
parent.addEventListener('foo', parentFn);
286+
287+
el.dispatchEvent(event);
288+
289+
expect(fn).to.have.been.calledOnce;
290+
expect(parentFn).to.have.been.calledOnce;
291+
expect(parentFn.firstCall.args[0]).to.have.property('defaultPrevented', true);
292+
});
267293
});
268294
});
269295
});

0 commit comments

Comments
 (0)