UNPKG

leaflet

Version:

JavaScript library for mobile-friendly interactive maps

185 lines (158 loc) 4.98 kB
/* * @namespace Layer * @section Tooltip methods example * * All layers share a set of methods convenient for binding tooltips to it. * * ```js * var layer = L.Polygon(latlngs).bindTooltip('Hi There!').addTo(map); * layer.openTooltip(); * layer.closeTooltip(); * ``` */ // @section Tooltip methods L.Layer.include({ // @method bindTooltip(content: String|HTMLElement|Function|Tooltip, options?: Tooltip options): this // Binds a tooltip to the layer with the passed `content` and sets up the // neccessary event listeners. If a `Function` is passed it will receive // the layer as the first argument and should return a `String` or `HTMLElement`. bindTooltip: function (content, options) { if (content instanceof L.Tooltip) { L.setOptions(content, options); this._tooltip = content; content._source = this; } else { if (!this._tooltip || options) { this._tooltip = L.tooltip(options, this); } this._tooltip.setContent(content); } this._initTooltipInteractions(); if (this._tooltip.options.permanent && this._map && this._map.hasLayer(this)) { this.openTooltip(); } return this; }, // @method unbindTooltip(): this // Removes the tooltip previously bound with `bindTooltip`. unbindTooltip: function () { if (this._tooltip) { this._initTooltipInteractions(true); this.closeTooltip(); this._tooltip = null; } return this; }, _initTooltipInteractions: function (remove) { if (!remove && this._tooltipHandlersAdded) { return; } var onOff = remove ? 'off' : 'on', events = { remove: this.closeTooltip, move: this._moveTooltip }; if (!this._tooltip.options.permanent) { events.mouseover = this._openTooltip; events.mouseout = this.closeTooltip; if (this._tooltip.options.sticky) { events.mousemove = this._moveTooltip; } if (L.Browser.touch) { events.click = this._openTooltip; } } else { events.add = this._openTooltip; } this[onOff](events); this._tooltipHandlersAdded = !remove; }, // @method openTooltip(latlng?: LatLng): this // Opens the bound tooltip at the specificed `latlng` or at the default tooltip anchor if no `latlng` is passed. openTooltip: function (layer, latlng) { if (!(layer instanceof L.Layer)) { latlng = layer; layer = this; } if (layer instanceof L.FeatureGroup) { for (var id in this._layers) { layer = this._layers[id]; break; } } if (!latlng) { latlng = layer.getCenter ? layer.getCenter() : layer.getLatLng(); } if (this._tooltip && this._map) { // set tooltip source to this layer this._tooltip._source = layer; // update the tooltip (content, layout, ect...) this._tooltip.update(); // open the tooltip on the map this._map.openTooltip(this._tooltip, latlng); // Tooltip container may not be defined if not permanent and never // opened. if (this._tooltip.options.interactive && this._tooltip._container) { L.DomUtil.addClass(this._tooltip._container, 'leaflet-clickable'); this.addInteractiveTarget(this._tooltip._container); } } return this; }, // @method closeTooltip(): this // Closes the tooltip bound to this layer if it is open. closeTooltip: function () { if (this._tooltip) { this._tooltip._close(); if (this._tooltip.options.interactive && this._tooltip._container) { L.DomUtil.removeClass(this._tooltip._container, 'leaflet-clickable'); this.removeInteractiveTarget(this._tooltip._container); } } return this; }, // @method toggleTooltip(): this // Opens or closes the tooltip bound to this layer depending on its current state. toggleTooltip: function (target) { if (this._tooltip) { if (this._tooltip._map) { this.closeTooltip(); } else { this.openTooltip(target); } } return this; }, // @method isTooltipOpen(): boolean // Returns `true` if the tooltip bound to this layer is currently open. isTooltipOpen: function () { return this._tooltip.isOpen(); }, // @method setTooltipContent(content: String|HTMLElement|Tooltip): this // Sets the content of the tooltip bound to this layer. setTooltipContent: function (content) { if (this._tooltip) { this._tooltip.setContent(content); } return this; }, // @method getTooltip(): Tooltip // Returns the tooltip bound to this layer. getTooltip: function () { return this._tooltip; }, _openTooltip: function (e) { var layer = e.layer || e.target; if (!this._tooltip || !this._map) { return; } this.openTooltip(layer, this._tooltip.options.sticky ? e.latlng : undefined); }, _moveTooltip: function (e) { var latlng = e.latlng, containerPoint, layerPoint; if (this._tooltip.options.sticky && e.originalEvent) { containerPoint = this._map.mouseEventToContainerPoint(e.originalEvent); layerPoint = this._map.containerPointToLayerPoint(containerPoint); latlng = this._map.layerPointToLatLng(layerPoint); } this._tooltip.setLatLng(latlng); } });