From 1d1b9bf01af28a84b2af978de199289e9f1e0818 Mon Sep 17 00:00:00 2001 From: Ben Delarre Date: Tue, 23 Sep 2014 14:31:53 -0700 Subject: [PATCH] Added support for pointer API so this now works in IE11. --- src/mousetracker.js | 93 ++++++++++++++++++++++++++++++++++++--------- 1 file changed, 76 insertions(+), 17 deletions(-) diff --git a/src/mousetracker.js b/src/mousetracker.js index 6f58ffa5..0c865c74 100644 --- a/src/mousetracker.js +++ b/src/mousetracker.js @@ -209,6 +209,10 @@ MSPointerOver: function ( event ) { onPointerOver( _this, event ); }, pointerout: function ( event ) { onPointerOut( _this, event ); }, MSPointerOut: function ( event ) { onPointerOut( _this, event ); }, + + pointeroutdocument: function ( event ) { onPointerOutDocument( _this, event ); }, + MSPointerOutdocument: function ( event ) { onPointerOutDocument( _this, event ); }, + pointerdown: function ( event ) { onPointerDown( _this, event ); }, MSPointerDown: function ( event ) { onPointerDown( _this, event ); }, pointerup: function ( event ) { onPointerUp( _this, event ); }, @@ -1051,9 +1055,15 @@ false ); } - - // handle mouse out of document area - $.addEvent(document.body, "mouseout", delegate.mouseoutdocument); + + // handle pointer/mouse out of document body + if ( window.PointerEvent ) { + $.addEvent(document.body, "pointerout", delegate.pointeroutdocument); + } else if ( window.MSPointerEvent ) { + $.addEvent(document.body, "pointerout", delegate.MSPointerOutdocument); + } else { + $.addEvent(document.body, "mouseout", delegate.mouseoutdocument); + } delegate.tracking = true; } @@ -1080,8 +1090,14 @@ ); } - // handle mouse out of document area - $.removeEvent(document.body, "mouseout", delegate.mouseoutdocument); + // handle pointer/mouse out of document body + if ( window.PointerEvent ) { + $.removeEvent(document.body, "pointerout", delegate.pointeroutdocument); + } else if ( window.MSPointerEvent ) { + $.removeEvent(document.body, "MSPointerOut", delegate.MSPointerOutdocument); + } else { + $.removeEvent(document.body, "mouseout", delegate.mouseoutdocument); + } delegate.tracking = false; } @@ -1465,6 +1481,35 @@ updatePointersExit( tracker, event, [ gPoint ] ); } + /** + * This handler is used to handle the case where the mouse is dragged out of the window, it should cause the drag to be properly released. + * + * @private + * @inner + */ + function onMouseOutDocument( tracker, event ) { + event = $.getEvent( event ); + + var html = document.getElementsByTagName("html")[0]; + var target = event.target || event.srcElement; + if ((event.relatedTarget!==html && event.relatedTarget!==null) || event.currentTarget !== document.body) { + return; // not a mouseout of the iframe + } + + var gPoint = { + id: $.MouseTracker.mousePointerId, + type: 'mouse', + isPrimary: true, + currentPos: getMouseAbsolute( event ), + currentTime: $.now() + }; + + event.buttons = undefined; + + if ( updatePointersUp( tracker, event, [ gPoint ], 0 ) ) { + releasePointer( tracker, true ); + } + } /** * @private @@ -1537,18 +1582,6 @@ } } - function onMouseOutDocument( tracker, event ) { - event = $.getEvent( event ); - - var html = document.getElementsByTagName("html")[0]; - if ((event.relatedTarget!==html && event.relatedTarget!==null) || event.currentTarget !== document.body) { - return; // not a mouseout of the iframe - } - event.buttons = undefined; - event.button = 0; - handleMouseUp(tracker,event); - } - /** * @private * @inner @@ -1820,6 +1853,32 @@ updatePointersExit( tracker, event, [ gPoint ] ); } + /** + * This handler is used to handle the case where the pointer is dragged out of the window, it should cause the drag to be properly released. + * + * @private + * @inner + */ + function onPointerOutDocument( tracker, event ) { + event = $.getEvent( event ); + + var html = document.getElementsByTagName("html")[0]; + if ((event.relatedTarget!==html && event.relatedTarget!==null) || event.currentTarget !== document.body) { + return; // not a mouseout of the iframe + } + + var gPoint = { + id: event.pointerId, + type: getPointerType( event ), + isPrimary: event.isPrimary, + currentPos: getMouseAbsolute( event ), + currentTime: $.now() + }; + + if ( updatePointersUp( tracker, event, [ gPoint ], 0 ) ) { + releasePointer( tracker, false ); + } + } /** * @private