fifamaniac04
fifamaniac04

Reputation: 2383

Leaflet Mouseout called on MouseOver event

I have a leaflet map where I'm dynamically adding markers.

I want to call the popup for a marker when I hover over it in addition to when I click the marker.

My code is:

function makeMarker(){
   var Marker = L.marker...
   Marker.on('mouseover', function(){Marker.bindPopup('HI').openPopup();});

   Marker.on('mouseout', function(){Marker.closePopup();});
}

If I comment out the mouseout line, then the popup appears but then I have to click elswhere to close it. The problem is when I put in the mouseout, at that point, the cursor kinda flickers when it hovers over the marker and nothing shows. I think that the popup is openning but then closing really fast which is why the cursor flickers but I don't know how to fix this

Upvotes: 18

Views: 10803

Answers (3)

aqw
aqw

Reputation: 145

I also recently came across this problem again too. In case this helps anyone: As of Leaflet 1.0, you can use L.Tooltip instead of popups with mouseover or other mouse-related events. I've found that it works much more smoothly than making a Popup, and uses less code, especially if you're just opening the popup on hover. In your case it might look like:

function makeMarker(){
  var Marker = L.marker...
  Marker.bindTooltip('HI').openPopup();
}

And you can use the permanent boolean flag if you want to keep it open.

In my case I didn't need the popup to open on click (in addition to hover), so that might be a little more complicated. However L.Tooltip has become very widely used and there are other SO questions that deal with this issue.

Upvotes: 0

piotrsz
piotrsz

Reputation: 1152

I know it's an old thread but I've just came across this issue and I thought that I can share my solution. Instead of offsetting the popup, I am preventing the popup from stealing the mouse event using CSS by setting:

.my-popup {pointer-events: none;}

and assigning my-popup className to the popup:

Marker.on('mouseover', function () {Marker.bindPopup('HI', {className: 'my-popup'}).openPopup();})

I hope this helps someone :)

Upvotes: 18

BlueWater86
BlueWater86

Reputation: 1817

The popup is actually loading underneath the cursor and 'stealing' the mouse from the Marker, triggering the Marker.mouseout() event, which causes the popup to close and re-triggers the Marker.mouseover() event... and the cycle continues which is why you see the 'flicker'.

I have seen this happen depending on the zoom level (usually when zoomed right out).

Try adding an offset into your popup options to get it out of the way:

function makeMarker(){
   var Marker = L.marker...
   Marker.on('mouseover', function(){Marker.bindPopup('HI', {'offset': L.point(0,-50)}).openPopup();});

   Marker.on('mouseout', function(){Marker.closePopup();});
}

Upvotes: 16

Related Questions