diff options
| author | gockxml | 2013-04-29 18:14:40 +0100 |
|---|---|---|
| committer | Pete Bacon Darwin | 2013-04-29 18:26:32 +0100 |
| commit | 06f2b2a8cf7e8216ad9ef05f73426271c2d97faa (patch) | |
| tree | e9890deaf8d9f4f66868df33cda43cb9ec34585a /test/jqLiteSpec.js | |
| parent | 0985a37376314616ac2b777bddd8bc07e1be7af7 (diff) | |
| download | angular.js-06f2b2a8cf7e8216ad9ef05f73426271c2d97faa.tar.bz2 | |
fix(jqLite): correct implementation of mouseenter/mouseleave event
Implement mouseenter/mouseleave event referring to
http://www.quirksmode.org/js/events_mouse.html#link8 and jQuery source
code(not dependent on jQuery).
The old implementation is wrong. When moving mouse from a parent element
into a child element, it would trigger mouseleave event, which should not.
And the old test about mouseenter/mouseleave is wrong too. It just
triggers mouseover and mouseout events, cannot describe the process of mouse
moving from one element to another element, which is important for
mouseenter/mouseleave.
Closes #2131, #1811
Diffstat (limited to 'test/jqLiteSpec.js')
| -rw-r--r-- | test/jqLiteSpec.js | 49 |
1 files changed, 37 insertions, 12 deletions
diff --git a/test/jqLiteSpec.js b/test/jqLiteSpec.js index b1fa6b05..089ae78c 100644 --- a/test/jqLiteSpec.js +++ b/test/jqLiteSpec.js @@ -775,13 +775,9 @@ describe('jqLite', function() { parent.bind('mouseenter', function() { log += 'parentEnter;'; }); parent.bind('mouseleave', function() { log += 'parentLeave;'; }); - parent.mouseover = function() { browserTrigger(parent, 'mouseover'); }; - parent.mouseout = function() { browserTrigger(parent, 'mouseout'); }; child.bind('mouseenter', function() { log += 'childEnter;'; }); child.bind('mouseleave', function() { log += 'childLeave;'; }); - child.mouseover = function() { browserTrigger(child, 'mouseover'); }; - child.mouseout = function() { browserTrigger(child, 'mouseout'); }; }); afterEach(function() { @@ -790,20 +786,49 @@ describe('jqLite', function() { it('should fire mouseenter when coming from outside the browser window', function() { if (window.jQuery) return; - parent.mouseover(); + var browserMoveTrigger = function(from, to){ + var fireEvent = function(type, element, relatedTarget){ + var msie = parseInt((/msie (\d+)/.exec(navigator.userAgent.toLowerCase()) || [])[1]); + if (msie < 9){ + var evnt = document.createEventObject(); + evnt.srcElement = element; + evnt.relatedTarget = relatedTarget; + element.fireEvent('on' + type, evnt); + return; + }; + var evnt = document.createEvent('MouseEvents'), + originalPreventDefault = evnt.preventDefault, + appWindow = window, + fakeProcessDefault = true, + finalProcessDefault; + + evnt.preventDefault = function() { + fakeProcessDefault = false; + return originalPreventDefault.apply(evnt, arguments); + }; + + var x = 0, y = 0; + evnt.initMouseEvent(type, true, true, window, 0, x, y, x, y, false, false, + false, false, 0, relatedTarget); + + element.dispatchEvent(evnt); + }; + fireEvent('mouseout', from[0], to[0]); + fireEvent('mouseover', to[0], from[0]); + }; + + browserMoveTrigger(root, parent); expect(log).toEqual('parentEnter;'); - child.mouseover(); - expect(log).toEqual('parentEnter;childEnter;'); - child.mouseover(); + browserMoveTrigger(parent, child); expect(log).toEqual('parentEnter;childEnter;'); - child.mouseout(); - expect(log).toEqual('parentEnter;childEnter;'); - child.mouseout(); + browserMoveTrigger(child, parent); expect(log).toEqual('parentEnter;childEnter;childLeave;'); - parent.mouseout(); + + browserMoveTrigger(parent, root); expect(log).toEqual('parentEnter;childEnter;childLeave;parentLeave;'); + }); }); }); |
