Skip to content

Commit d7b1370

Browse files
committed
Copy event handler arrays on write
Rather than on read
1 parent 441641e commit d7b1370

File tree

2 files changed

+19
-18
lines changed

2 files changed

+19
-18
lines changed

src/util/event.js

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -6,39 +6,40 @@ import { indexOf } from "./misc"
66
// Lightweight event framework. on/off also work on DOM nodes,
77
// registering native DOM handlers.
88

9+
const noHandlers = []
10+
911
export let on = function(emitter, type, f) {
10-
if (emitter.addEventListener)
12+
if (emitter.addEventListener) {
1113
emitter.addEventListener(type, f, false)
12-
else if (emitter.attachEvent)
14+
} else if (emitter.attachEvent) {
1315
emitter.attachEvent("on" + type, f)
14-
else {
16+
} else {
1517
let map = emitter._handlers || (emitter._handlers = {})
16-
let arr = map[type] || (map[type] = [])
17-
arr.push(f)
18+
map[type] = (map[type] || noHandlers).concat(f)
1819
}
1920
}
2021

21-
let noHandlers = []
22-
export function getHandlers(emitter, type, copy) {
23-
let arr = emitter._handlers && emitter._handlers[type]
24-
if (copy) return arr && arr.length > 0 ? arr.slice() : noHandlers
25-
else return arr || noHandlers
22+
export function getHandlers(emitter, type) {
23+
return emitter._handlers && emitter._handlers[type] || noHandlers
2624
}
2725

2826
export function off(emitter, type, f) {
29-
if (emitter.removeEventListener)
27+
if (emitter.removeEventListener) {
3028
emitter.removeEventListener(type, f, false)
31-
else if (emitter.detachEvent)
29+
} else if (emitter.detachEvent) {
3230
emitter.detachEvent("on" + type, f)
33-
else {
34-
let handlers = getHandlers(emitter, type, false)
35-
for (let i = 0; i < handlers.length; ++i)
36-
if (handlers[i] == f) { handlers.splice(i, 1); break }
31+
} else {
32+
let map = emitter._handlers, arr = map && map[type]
33+
if (arr) {
34+
let index = indexOf(arr, f)
35+
if (index > -1)
36+
map[type] = arr.slice(0, index).concat(arr.slice(index + 1))
37+
}
3738
}
3839
}
3940

4041
export function signal(emitter, type /*, values...*/) {
41-
let handlers = getHandlers(emitter, type, true)
42+
let handlers = getHandlers(emitter, type)
4243
if (!handlers.length) return
4344
let args = Array.prototype.slice.call(arguments, 2)
4445
for (let i = 0; i < handlers.length; ++i) handlers[i].apply(null, args)

src/util/operation_group.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ let orphanDelayedCallbacks = null
5050
// them to be executed when the last operation ends, or, if no
5151
// operation is active, when a timeout fires.
5252
export function signalLater(emitter, type /*, values...*/) {
53-
let arr = getHandlers(emitter, type, false)
53+
let arr = getHandlers(emitter, type)
5454
if (!arr.length) return
5555
let args = Array.prototype.slice.call(arguments, 2), list
5656
if (operationGroup) {

0 commit comments

Comments
 (0)