1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 | 1 1 1 664 664 66 179 179 66 598 598 663 663 571 571 11 560 560 92 92 598 219 17 17 3 6 6 3 14 14 14 12 12 7 5 12 14 12 12 4 4 4 14 205 138 67 67 67 11 11 14 67 67 58 63 63 63 63 64 67 1 1 1 | /* * L.Mixin.Events is used to add custom events functionality to Leaflet classes. */ var key = '_leaflet_events'; L.Mixin = {}; L.Mixin.Events = { addEventListener: function (types, fn, context) { // (String, Function[, Object]) or (Object[, Object]) var events = this[key] = this[key] || {}, contextId = context && L.stamp(context), type, i, len, evt, objKey, objLenKey, eventsObj; // types can be a map of types/handlers if (typeof types === 'object') { for (type in types) { Eif (types.hasOwnProperty(type)) { this.addEventListener(type, types[type], fn); } } return this; } // types can be a string of space-separated words types = L.Util.splitWords(types); for (i = 0, len = types.length; i < len; i++) { evt = { action: fn, context: context || this }; if (contextId) { // store listeners of a particular context in a separate hash (if it has an id) // gives a major performance boost when removing thousands of map layers objKey = types[i] + '_idx', objLenKey = objKey + '_len', eventsObj = events[objKey] = events[objKey] || {}; if (eventsObj[contextId]) { eventsObj[contextId].push(evt); } else { eventsObj[contextId] = [evt]; events[objLenKey] = (events[objLenKey] || 0) + 1; } } else { events[types[i]] = events[types[i]] || []; events[types[i]].push(evt); } } return this; }, hasEventListeners: function (type) { // (String) -> Boolean return (key in this) && (((type in this[key]) && this[key][type].length > 0) || (this[key][type + '_idx_len'] > 0)); }, removeEventListener: function (types, fn, context) { // (String[, Function, Object]) or (Object[, Object]) var events = this[key], contextId = context && L.stamp(context), type, i, len, listeners, j, objKey, objLenKey; if (typeof types === 'object') { for (type in types) { Eif (types.hasOwnProperty(type)) { this.removeEventListener(type, types[type], fn); } } return this; } types = L.Util.splitWords(types); for (i = 0, len = types.length; i < len; i++) { if (this.hasEventListeners(types[i])) { objKey = types[i] + '_idx'; if (contextId && events[objKey]) { listeners = events[objKey][contextId] || []; } else { listeners = events[types[i]] || []; } for (j = listeners.length - 1; j >= 0; j--) { if ((!fn || listeners[j].action === fn) && (!context || (listeners[j].context === context))) { listeners.splice(j, 1); } } if (contextId && listeners.length === 0 && events[objKey] && events[objKey][contextId]) { objLenKey = objKey + '_len'; delete events[objKey][contextId]; events[objLenKey] = (events[objLenKey] || 1) - 1; } } } return this; }, fireEvent: function (type, data) { // (String[, Object]) if (!this.hasEventListeners(type)) { return this; } var event = L.Util.extend({}, data, { type: type, target: this }); var listeners, i, len, eventsObj, contextId; if (this[key][type]) { listeners = this[key][type].slice(); for (i = 0, len = listeners.length; i < len; i++) { listeners[i].action.call(listeners[i].context || this, event); } } // fire event for the context-indexed listeners as well eventsObj = this[key][type + '_idx']; if (eventsObj) { for (contextId in eventsObj) { Eif (eventsObj.hasOwnProperty(contextId)) { listeners = eventsObj[contextId]; Eif (listeners) { for (i = 0, len = listeners.length; i < len; i++) { listeners[i].action.call(listeners[i].context || this, event); } } } } } return this; } }; L.Mixin.Events.on = L.Mixin.Events.addEventListener; L.Mixin.Events.off = L.Mixin.Events.removeEventListener; L.Mixin.Events.fire = L.Mixin.Events.fireEvent; |