2015-10-09 13 views
8

Wenn Sie das Mausrad verwenden, um eine Seite nach unten zu scrollen, wird das mouseleave-Ereignis in IE11 nicht ausgelöst, bis der Cursor verschoben wird. Funktioniert gut in Google Chrome.mouseleave-Ereignis feuert nicht auf Mausrad scrollen in IE11

jsFiddle: http://jsfiddle.net/tonyleeper/5vwf65f7/

HTML

<div class="box">Move the mouse cursor inside this box and observe the mouseenter event fires (background goes green). Next, use the mouse wheel to scroll down without moving the mouse cursor position, observe the mouseleave event doesn't fire. Finally, move the mouse cursor even a little, say 1px, and observe that the mouseleave event then fires</div> 

CSS

.box { 
    font-family: arial; 
    font-size: 16px; 
    width: 300px; 
    height: 200px; 
    background-color: #000077; 
    color: #ffffff; 
} 

JavaScript

var box = document.getElementsByClassName('box')[0]; 

box.addEventListener('mouseenter', function (e) { 
    document.body.setAttribute('style', 'background-color: #007700'); 
}); 

box.addEventListener('mouseleave', function (e) { 
    document.body.setAttribute('style', 'background-color: #ffffff'); 
}); 

Gibt es bekannte Problemumgehungen dafür, das Ereignis auf Scroll zu erzwingen?

jQuery scheint das gleiche Problem zu haben: https://api.jquery.com/mouseleave/

+0

Der scheinbare Unterschied der IE ist nicht die Position des Mauszeigers aktualisieren nach dem Scrollen, während Chrom tut. Das Auslösen von Mousemove scheint nicht zu funktionieren, um das Update zu erzwingen ... –

+1

Ich benutze Chrome Version 45.0.2454.101 und es ist das gleiche Verhalten wie IE11 - wird nicht aktualisiert, wenn man wegscrollt und die Maus nicht bewegt. Dies könnte nur das erwartete Verhalten sein. – Shahar

+0

@Shahar Das ist seltsam, ich bin auch auf Chrome 45.0.2454.101 und ich kann sehen, das Verhalten unterscheidet sich von IE, scrollen entfernt Brände mouseleave – magritte

Antwort

1

Sie Ihre Zuhörer in eine Funktion setzen könnte und bringen auch eine scroll eventlistener. Dort konnte man überprüfen, ob sich der Mauszeiger noch ‚innerhalb‘ der 'box' und rufen Sie die entsprechende Funktion ist:

var triggerOnMouseLeave = function(e) { 
    document.body.setAttribute('style', 'background-color: #ffffff'); 
} 

box.addEventListener('mouseleave', triggerOnMouseLeave); 

var triggerOnScroll = function(e) { 
    // Using jQuery here 
    if (!$(box).is(':hover')) { 
     triggerOnMouseLeave(); 
    } 
} 

window.addEventListener('scroll', triggerOnScroll); 
+0

Danke LuudJacobs, das ist ziemlich genau das, was ich getan habe, um es zu umgehen. – magritte