|
532 | 532 |
|
533 | 533 | // These two functions take an optional UID as a second argument so that we
|
534 | 534 | // can skip lookup if we've already got the element's UID.
|
535 |
| - function getRegistryForElement(element, uid) { |
| 535 | + function getOrCreateRegistryFor(element, uid) { |
536 | 536 | var CACHE = GLOBAL.Event.cache;
|
537 | 537 | if (Object.isUndefined(uid))
|
538 | 538 | uid = getUniqueElementID(element);
|
|
552 | 552 |
|
553 | 553 | // Add an event to the element's event registry.
|
554 | 554 | function register(element, eventName, handler) {
|
555 |
| - var registry = getRegistryForElement(element); |
| 555 | + var registry = getOrCreateRegistryFor(element); |
556 | 556 | if (!registry[eventName]) registry[eventName] = [];
|
557 | 557 | var entries = registry[eventName];
|
558 | 558 |
|
|
574 | 574 |
|
575 | 575 | // Remove an event from the element's event registry.
|
576 | 576 | function unregister(element, eventName, handler) {
|
577 |
| - var registry = getRegistryForElement(element); |
578 |
| - var entries = registry[eventName]; |
579 |
| - if (!entries) return; |
| 577 | + var registry = getOrCreateRegistryFor(element); |
| 578 | + var entries = registry[eventName] || []; |
580 | 579 |
|
| 580 | + // Looking for entry: |
581 | 581 | var i = entries.length, entry;
|
582 | 582 | while (i--) {
|
583 | 583 | if (entries[i].handler === handler) {
|
|
586 | 586 | }
|
587 | 587 | }
|
588 | 588 |
|
589 |
| - // This handler wasn't in the collection, so it doesn't need to be |
590 |
| - // unregistered. |
591 |
| - if (!entry) return; |
592 |
| - |
593 |
| - // Remove the entry from the collection; |
594 |
| - var index = entries.indexOf(entry); |
595 |
| - entries.splice(index, 1); |
| 589 | + if (entry) { |
| 590 | + // Remove the entry from the collection; |
| 591 | + var index = entries.indexOf(entry); |
| 592 | + entries.splice(index, 1); |
| 593 | + } |
596 | 594 |
|
| 595 | + // Last entry for given event was deleted? |
597 | 596 | if (entries.length === 0) {
|
598 | 597 | // We can destroy the registry's entry for this event name...
|
599 | 598 | delete registry[eventName];
|
|
929 | 928 |
|
930 | 929 | // Stop observing all listeners of a certain event name on an element.
|
931 | 930 | function stopObservingEventName(element, eventName) {
|
932 |
| - var registry = getRegistryForElement(element); |
| 931 | + var registry = getOrCreateRegistryFor(element); |
933 | 932 | var entries = registry[eventName];
|
934 |
| - if (!entries) return; |
935 |
| - delete registry[eventName]; |
| 933 | + if (entries) { |
| 934 | + delete registry[eventName]; |
| 935 | + } |
| 936 | + |
| 937 | + entries = entries || []; |
936 | 938 |
|
937 | 939 | var i = entries.length;
|
938 | 940 | while (i--)
|
939 | 941 | removeEvent(element, eventName, entries[i].responder);
|
| 942 | + |
| 943 | + for (var name in registry) { |
| 944 | + if (name === 'element') continue; |
| 945 | + return; // There is another registered event |
| 946 | + } |
| 947 | + |
| 948 | + // No other events for the element, destroy the registry: |
| 949 | + destroyRegistryForElement(element); |
940 | 950 | }
|
941 | 951 |
|
942 | 952 |
|
|
1349 | 1359 |
|
1350 | 1360 | function createResponderForCustomEvent(uid, eventName, handler) {
|
1351 | 1361 | return function(event) {
|
1352 |
| - var element = Event.cache[uid].element; |
| 1362 | + var cache = Event.cache[uid]; |
| 1363 | + var element = cache && cache.element; |
1353 | 1364 |
|
1354 | 1365 | if (Object.isUndefined(event.eventName))
|
1355 | 1366 | return false;
|
|
0 commit comments