/* * L.DomEvent contains functions for working with DOM events. */ L.DomEvent = { /* inpired by John Resig, Dean Edwards and YUI addEvent implementations */ addListener: function (/*HTMLElement*/ obj, /*String*/ type, /*Function*/ fn, /*Object*/ context) { var id = L.Util.stamp(fn), key = '_leaflet_' + type + id; if (obj[key]) { return this; } var handler = function (e) { return fn.call(context || obj, e || L.DomEvent._getEvent()); }; if (L.Browser.touch && (type === 'dblclick') && this.addDoubleTapListener) { this.addDoubleTapListener(obj, handler, id); } else if ('addEventListener' in obj) { if (type === 'mousewheel') { obj.addEventListener('DOMMouseScroll', handler, false); obj.addEventListener(type, handler, false); } else if ((type === 'mouseenter') || (type === 'mouseleave')) { var originalHandler = handler, newType = (type === 'mouseenter' ? 'mouseover' : 'mouseout'); handler = function (e) { if (!L.DomEvent._checkMouse(obj, e)) { return; } return originalHandler(e); }; obj.addEventListener(newType, handler, false); } else { obj.addEventListener(type, handler, false); } } else if ('attachEvent' in obj) { obj.attachEvent("on" + type, handler); } obj[key] = handler; return this; }, removeListener: function (/*HTMLElement*/ obj, /*String*/ type, /*Function*/ fn) { var id = L.Util.stamp(fn), key = '_leaflet_' + type + id, handler = obj[key]; if (!handler) { return; } if (L.Browser.touch && (type === 'dblclick') && this.removeDoubleTapListener) { this.removeDoubleTapListener(obj, id); } else if ('removeEventListener' in obj) { if (type === 'mousewheel') { obj.removeEventListener('DOMMouseScroll', handler, false); obj.removeEventListener(type, handler, false); } else if ((type === 'mouseenter') || (type === 'mouseleave')) { obj.removeEventListener((type === 'mouseenter' ? 'mouseover' : 'mouseout'), handler, false); } else { obj.removeEventListener(type, handler, false); } } else if ('detachEvent' in obj) { obj.detachEvent("on" + type, handler); } obj[key] = null; return this; }, _checkMouse: function (el, e) { var related = e.relatedTarget; if (!related) { return true; } try { while (related && (related !== el)) { related = related.parentNode; } } catch (err) { return false; } return (related !== el); }, /*jshint noarg:false */ // evil magic for IE _getEvent: function () { var e = window.event; if (!e) { var caller = arguments.callee.caller; while (caller) { e = caller['arguments'][0]; if (e && window.Event === e.constructor) { break; } caller = caller.caller; } } return e; }, /*jshint noarg:false */ stopPropagation: function (/*Event*/ e) { if (e.stopPropagation) { e.stopPropagation(); } else { e.cancelBubble = true; } return this; }, disableClickPropagation: function (/*HTMLElement*/ el) { return L.DomEvent .addListener(el, L.Draggable.START, L.DomEvent.stopPropagation) .addListener(el, 'click', L.DomEvent.stopPropagation) .addListener(el, 'dblclick', L.DomEvent.stopPropagation); }, preventDefault: function (/*Event*/ e) { if (e.preventDefault) { e.preventDefault(); } else { e.returnValue = false; } return this; }, stop: function (e) { return L.DomEvent .preventDefault(e) .stopPropagation(e); }, getMousePosition: function (e, container) { var x = e.pageX ? e.pageX : e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft, y = e.pageY ? e.pageY : e.clientY + document.body.scrollTop + document.documentElement.scrollTop, pos = new L.Point(x, y); return (container ? pos.subtract(L.DomUtil.getViewportOffset(container)) : pos); }, getWheelDelta: function (e) { var delta = 0; if (e.wheelDelta) { delta = e.wheelDelta / 120; } if (e.detail) { delta = -e.detail / 3; } return delta; } };