class HTMLMapMarker extends google.maps.OverlayView {
|
constructor(args) {
|
super();
|
this._latlng = args.latlng;
|
this._html = args.html;
|
this._map = args.map;
|
this._width = args.width;
|
this._height = args.height;
|
this.setMap(args.map);
|
}
|
|
createDiv() {
|
this.div = document.createElement('div');
|
this.div.style.position = 'absolute';
|
if (this._width && this._height) {
|
this.div.style.width = this._width;
|
this.div.style.height = this._height;
|
}
|
if (this._html) {
|
this.div.innerHTML = this._html;
|
}
|
|
google.maps.event.addDomListener(this.div, 'click', (event) => {
|
event.stopPropagation();
|
|
google.maps.event.trigger(this, 'click', event);
|
});
|
}
|
|
positionDiv() {
|
const point = this.getProjection().fromLatLngToDivPixel(this._latlng);
|
if (point) {
|
const left = point.x - this.div.clientWidth/2;
|
this.div.style.left = `${left}px`;
|
const top = point.y - this.div.clientHeight/2;
|
this.div.style.top = `${top}px`;
|
}
|
}
|
onAdd() {
|
if (!this.div) {
|
this.createDiv();
|
this.getPanes().overlayMouseTarget.appendChild(this.div);
|
}
|
this.positionDiv();
|
}
|
|
draw() {
|
this.positionDiv();
|
}
|
|
onRemove() {
|
if (this.div) {
|
this.div.parentNode.removeChild(this.div);
|
this.div = null;
|
}
|
}
|
|
getPosition() {
|
return this._latlng;
|
}
|
|
detach() {
|
if (this.getMap()) {
|
this.setMap(null);
|
}
|
};
|
|
attach() {
|
if (!this.getMap()) {
|
this.setMap(this._map);
|
}
|
};
|
|
setSize(width, height) {
|
this._width = width;
|
this._height = height;
|
if (this.div) {
|
this.div.style.width = this._width;
|
this.div.style.height = this._height;
|
}
|
}
|
}
|
|
|