Per #1863, dropped support for Internet Explorer < 11

This commit is contained in:
Mark Salsbery 2021-03-04 15:48:13 -08:00
parent 6a1a6275ed
commit 5674cf47ad
2 changed files with 122 additions and 613 deletions

View File

@ -20,8 +20,6 @@ OPENSEADRAGON CHANGELOG
* MouseTracker: changed enterHandler/leaveHandler to use DOM pointerenter/pointerleave events instead of simulating using pointerover/pointerout (#1872 @msalsbery) * MouseTracker: changed enterHandler/leaveHandler to use DOM pointerenter/pointerleave events instead of simulating using pointerover/pointerout (#1872 @msalsbery)
* All internal uses of MouseTracker use pointerenter/pointerleave events instead of pointerover/pointerout events for more consistent pointer tracking (#1872 @msalsbery) * All internal uses of MouseTracker use pointerenter/pointerleave events instead of pointerover/pointerout events for more consistent pointer tracking (#1872 @msalsbery)
* Fixed bug in Button class where two MouseTracker event handlers used an invalid "this" causing issues in some browsers (#1872 @msalsbery) * Fixed bug in Button class where two MouseTracker event handlers used an invalid "this" causing issues in some browsers (#1872 @msalsbery)
* MouseTracker: IE 10 - MSPointerEnter/MSPointerLeave didn't exist then, simulated with MSPointerOver/MSPointerOut (#1872 @msalsbery)
* MouseTracker: Simulate mouseover/mouseout on IE < 9 (#1872 @msalsbery)
* Added pointerType property to Viewer container-enter, container-exit, canvas-drag, canvas-drag-end, canvas-pinch events (#1872 @msalsbery) * Added pointerType property to Viewer container-enter, container-exit, canvas-drag, canvas-drag-end, canvas-pinch events (#1872 @msalsbery)
* MouseTracker: Fire dragEndHandler event even if release point same as initial contact point (#1872 @msalsbery) * MouseTracker: Fire dragEndHandler event even if release point same as initial contact point (#1872 @msalsbery)
* MouseTracker: Pointer capture implemented with capture APIs where available. Only fallback to emulated capture on extremely old browsers (#1872 @msalsbery) * MouseTracker: Pointer capture implemented with capture APIs where available. Only fallback to emulated capture on extremely old browsers (#1872 @msalsbery)
@ -33,6 +31,7 @@ OPENSEADRAGON CHANGELOG
* MouseTracker: added contextMenuHandler option for handling contextmenu events (#1872 @msalsbery) * MouseTracker: added contextMenuHandler option for handling contextmenu events (#1872 @msalsbery)
* Viewer: added a canvas-contextmenu event (#1872 @msalsbery) * Viewer: added a canvas-contextmenu event (#1872 @msalsbery)
* Added additional documentation for the zoomPerSecond viewer option (#1872 @msalsbery) * Added additional documentation for the zoomPerSecond viewer option (#1872 @msalsbery)
* MouseTracker: Per #1863, dropped support for Internet Explorer < 11 (#1872 @msalsbery)
2.4.2: 2.4.2:

View File

@ -224,15 +224,14 @@
MozMousePixelScroll: function ( event ) { onMouseWheel( _this, event ); }, MozMousePixelScroll: function ( event ) { onMouseWheel( _this, event ); },
losecapture: function ( event ) { onLoseCapture( _this, event ); }, losecapture: function ( event ) { onLoseCapture( _this, event ); },
mouseenter: function ( event ) { onMouseEnter( _this, event ); },
mouseleave: function ( event ) { onMouseLeave( _this, event ); }, mouseenter: function ( event ) { onPointerEnter( _this, event ); },
mouseover: function ( event ) { onMouseOver( _this, event ); }, // IE9+ only mouseleave: function ( event ) { onPointerLeave( _this, event ); },
mouseout: function ( event ) { onMouseOut( _this, event ); }, // IE9+ only mouseover: function ( event ) { onPointerOver( _this, event ); },
mousedown: function ( event ) { onMouseDown( _this, event ); }, mouseout: function ( event ) { onPointerOut( _this, event ); },
mouseup: function ( event ) { onMouseUp( _this, event ); }, mousedown: function ( event ) { onPointerDown( _this, event ); },
mouseupcaptured: function ( event ) { onMouseUpCaptured( _this, event ); }, mouseup: function ( event ) { onPointerUp( _this, event ); },
mousemove: function ( event ) { onMouseMove( _this, event ); }, mousemove: function ( event ) { onPointerMove( _this, event ); },
mousemovecaptured: function ( event ) { onMouseMoveCaptured( _this, event ); },
touchstart: function ( event ) { onTouchStart( _this, event ); }, touchstart: function ( event ) { onTouchStart( _this, event ); },
touchend: function ( event ) { onTouchEnd( _this, event ); }, touchend: function ( event ) { onTouchEnd( _this, event ); },
@ -242,27 +241,16 @@
gesturestart: function ( event ) { onGestureStart( _this, event ); }, // Safari/Safari iOS gesturestart: function ( event ) { onGestureStart( _this, event ); }, // Safari/Safari iOS
gesturechange: function ( event ) { onGestureChange( _this, event ); }, // Safari/Safari iOS gesturechange: function ( event ) { onGestureChange( _this, event ); }, // Safari/Safari iOS
MSGestureStart: function ( event ) { onGestureStart( _this, event ); }, // IE10
MSGestureChange: function ( event ) { onGestureChange( _this, event ); }, // IE10
gotpointercapture: function ( event ) { onGotPointerCapture( _this, event ); }, gotpointercapture: function ( event ) { onGotPointerCapture( _this, event ); },
MSGotPointerCapture: function ( event ) { onGotPointerCapture( _this, event ); },
lostpointercapture: function ( event ) { onLostPointerCapture( _this, event ); }, lostpointercapture: function ( event ) { onLostPointerCapture( _this, event ); },
MSLostPointerCapture: function ( event ) { onLostPointerCapture( _this, event ); },
pointerenter: function ( event ) { onPointerEnter( _this, event ); }, pointerenter: function ( event ) { onPointerEnter( _this, event ); },
pointerleave: function ( event ) { onPointerLeave( _this, event ); }, pointerleave: function ( event ) { onPointerLeave( _this, event ); },
pointerover: function ( event ) { onPointerOver( _this, event ); }, pointerover: function ( event ) { onPointerOver( _this, event ); },
MSPointerOver: function ( event ) { onPointerOver( _this, event ); },
pointerout: function ( event ) { onPointerOut( _this, event ); }, pointerout: function ( event ) { onPointerOut( _this, event ); },
MSPointerOut: function ( event ) { onPointerOut( _this, event ); },
pointerdown: function ( event ) { onPointerDown( _this, event ); }, pointerdown: function ( event ) { onPointerDown( _this, event ); },
MSPointerDown: function ( event ) { onPointerDown( _this, event ); },
pointerup: function ( event ) { onPointerUp( _this, event ); }, pointerup: function ( event ) { onPointerUp( _this, event ); },
MSPointerUp: function ( event ) { onPointerUp( _this, event ); },
pointermove: function ( event ) { onPointerMove( _this, event ); }, pointermove: function ( event ) { onPointerMove( _this, event ); },
MSPointerMove: function ( event ) { onPointerMove( _this, event ); },
pointercancel: function ( event ) { onPointerCancel( _this, event ); }, pointercancel: function ( event ) { onPointerCancel( _this, event ); },
MSPointerCancel: function ( event ) { onPointerCancel( _this, event ); },
pointerupcaptured: function ( event ) { onPointerUpCaptured( _this, event ); }, pointerupcaptured: function ( event ) { onPointerUpCaptured( _this, event ); },
pointermovecaptured: function ( event ) { onPointerMoveCaptured( _this, event ); }, pointermovecaptured: function ( event ) { onPointerMoveCaptured( _this, event ); },
@ -1167,8 +1155,6 @@
// IE11 and other W3C Pointer Event implementations (see http://www.w3.org/TR/pointerevents) // IE11 and other W3C Pointer Event implementations (see http://www.w3.org/TR/pointerevents)
$.MouseTracker.havePointerEvents = true; $.MouseTracker.havePointerEvents = true;
$.MouseTracker.subscribeEvents.push( "pointerenter", "pointerleave", "pointerover", "pointerout", "pointerdown", "pointerup", "pointermove", "pointercancel" ); $.MouseTracker.subscribeEvents.push( "pointerenter", "pointerleave", "pointerover", "pointerout", "pointerdown", "pointerup", "pointermove", "pointercancel" );
$.MouseTracker.unprefixedPointerEvents = true;
$.MouseTracker.havePointerOverOut = true;
// Pointer events capture support // Pointer events capture support
$.MouseTracker.havePointerCapture = (function () { $.MouseTracker.havePointerCapture = (function () {
var divElement = document.createElement( 'div' ); var divElement = document.createElement( 'div' );
@ -1177,33 +1163,10 @@
if ( $.MouseTracker.havePointerCapture ) { if ( $.MouseTracker.havePointerCapture ) {
$.MouseTracker.subscribeEvents.push( "gotpointercapture", "lostpointercapture" ); $.MouseTracker.subscribeEvents.push( "gotpointercapture", "lostpointercapture" );
} }
} else if ( window.MSPointerEvent && window.navigator.msPointerEnabled ) {
// IE10 (MSPointerEnter/MSPointerLeave simulated with MSPointerOver/MSPointerOut)
$.MouseTracker.havePointerEvents = true;
$.MouseTracker.subscribeEvents.push( "MSPointerOver", "MSPointerOut", "MSPointerDown", "MSPointerUp", "MSPointerMove", "MSPointerCancel" );
$.MouseTracker.unprefixedPointerEvents = false;
$.MouseTracker.havePointerOverOut = true;
// Prefixed pointer events capture support
$.MouseTracker.havePointerCapture = (function () {
var divElement = document.createElement( 'div' );
return $.isFunction( divElement.msSetPointerCapture ) && $.isFunction( divElement.msReleasePointerCapture );
}());
if ( $.MouseTracker.havePointerCapture ) {
$.MouseTracker.subscribeEvents.push( "MSGotPointerCapture", "MSLostPointerCapture" );
}
$.MouseTracker.subscribeEvents.push( "MSGestureStart", "MSGestureChange" );
} else { } else {
// Legacy W3C mouse events // Legacy W3C mouse events
$.MouseTracker.havePointerEvents = false; $.MouseTracker.havePointerEvents = false;
$.MouseTracker.unprefixedPointerEvents = true; $.MouseTracker.subscribeEvents.push( "mouseenter", "mouseleave", "mouseover", "mouseout", "mousedown", "mouseup", "mousemove" );
$.MouseTracker.subscribeEvents.push( "mouseenter", "mouseleave" );
if ( $.Browser.vendor !== $.BROWSERS.IE || $.Browser.version > 8 ) {
$.MouseTracker.subscribeEvents.push( "mouseover", "mouseout" );
$.MouseTracker.havePointerOverOut = true;
} else {
$.MouseTracker.havePointerOverOut = false;
}
$.MouseTracker.subscribeEvents.push( "mousedown", "mouseup", "mousemove" );
$.MouseTracker.mousePointerId = "legacy-mouse"; $.MouseTracker.mousePointerId = "legacy-mouse";
// Legacy mouse events capture support (IE/Firefox only?) // Legacy mouse events capture support (IE/Firefox only?)
$.MouseTracker.havePointerCapture = (function () { $.MouseTracker.havePointerCapture = (function () {
@ -1253,7 +1216,7 @@
* @property {Boolean} isEmulated * @property {Boolean} isEmulated
* True if this is an emulated event. If true, originalEvent is the event that caused * True if this is an emulated event. If true, originalEvent is the event that caused
* the emulated event or null if no DOM event applies. Emulated events * the emulated event or null if no DOM event applies. Emulated events
* can occur on eventType "pointerenter", "pointerleave", "pointerover", "pointerout". * can occur on eventType "wheel".
* @property {Boolean} isStopable * @property {Boolean} isStopable
* True if propagation of the event (e.g. bubbling) can be stopped with stopPropagation/stopImmediatePropagation. * True if propagation of the event (e.g. bubbling) can be stopped with stopPropagation/stopImmediatePropagation.
* @property {Boolean} isCancelable * @property {Boolean} isCancelable
@ -1572,17 +1535,17 @@
if ( pointerType === 'pointerevent' ) { if ( pointerType === 'pointerevent' ) {
return { return {
upName: $.MouseTracker.unprefixedPointerEvents ? 'pointerup' : 'MSPointerUp', upName: 'pointerup',
upHandler: delegate.pointerupcaptured, upHandler: delegate.pointerupcaptured,
moveName: $.MouseTracker.unprefixedPointerEvents ? 'pointermove' : 'MSPointerMove', moveName: 'pointermove',
moveHandler: delegate.pointermovecaptured moveHandler: delegate.pointermovecaptured
}; };
} else if ( pointerType === 'mouse' ) { } else if ( pointerType === 'mouse' ) {
return { return {
upName: 'mouseup', upName: 'pointerup',
upHandler: delegate.mouseupcaptured, upHandler: delegate.pointerupcaptured,
moveName: 'mousemove', moveName: 'pointermove',
moveHandler: delegate.mousemovecaptured moveHandler: delegate.pointermovecaptured
}; };
} else if ( pointerType === 'touch' ) { } else if ( pointerType === 'touch' ) {
return { return {
@ -1609,13 +1572,8 @@
// Can throw InvalidPointerId // Can throw InvalidPointerId
// (should never happen so we'll log a warning) // (should never happen so we'll log a warning)
try { try {
if ( $.MouseTracker.unprefixedPointerEvents ) {
tracker.element.setPointerCapture( gPoint.id ); tracker.element.setPointerCapture( gPoint.id );
//$.console.log('element.setPointerCapture() called'); //$.console.log('element.setPointerCapture() called');
} else {
tracker.element.msSetPointerCapture( gPoint.id );
//$.console.log('element.msSetPointerCapture() called');
}
} catch ( e ) { } catch ( e ) {
$.console.warn('setPointerCapture() called on invalid pointer ID'); $.console.warn('setPointerCapture() called on invalid pointer ID');
} }
@ -1676,13 +1634,8 @@
// Can throw InvalidPointerId // Can throw InvalidPointerId
// (should never happen, but it does on Firefox 79 touch so we won't log a warning) // (should never happen, but it does on Firefox 79 touch so we won't log a warning)
try { try {
if ( $.MouseTracker.unprefixedPointerEvents ) {
tracker.element.releasePointerCapture( gPoint.id ); tracker.element.releasePointerCapture( gPoint.id );
//$.console.log('element.releasePointerCapture() called'); //$.console.log('element.releasePointerCapture() called');
} else {
tracker.element.msReleasePointerCapture( gPoint.id );
//$.console.log('element.msReleasePointerCapture() called');
}
} catch ( e ) { } catch ( e ) {
//$.console.warn('releasePointerCapture() called on invalid pointer ID'); //$.console.warn('releasePointerCapture() called on invalid pointer ID');
} }
@ -1722,6 +1675,15 @@
} }
/**
* @private
* @inner
*/
function getPointerId( event ) {
return ( $.MouseTracker.havePointerEvents ) ? event.pointerId : $.MouseTracker.mousePointerId;
}
/** /**
* Gets a W3C Pointer Events model compatible pointer type string from a DOM pointer event. * Gets a W3C Pointer Events model compatible pointer type string from a DOM pointer event.
* IE10 used a long integer value, but the W3C specification (and IE11+) use a string "mouse", "touch", "pen", etc. * IE10 used a long integer value, but the W3C specification (and IE11+) use a string "mouse", "touch", "pen", etc.
@ -1729,33 +1691,23 @@
* @inner * @inner
*/ */
function getPointerType( event ) { function getPointerType( event ) {
if ( $.MouseTracker.havePointerEvents ) {
// Note: IE pointer events bug - sends invalid pointerType on lostpointercapture events // Note: IE pointer events bug - sends invalid pointerType on lostpointercapture events
// and possibly other events. We rely on sane, valid property values in DOM events, so for // and possibly other events. We rely on sane, valid property values in DOM events, so for
// IE, when the pointerType is missing, we'll default to 'mouse'...should be right most of the time // IE, when the pointerType is missing, we'll default to 'mouse'...should be right most of the time
var pointerTypeStr; return event.pointerType || (( $.Browser.vendor === $.BROWSERS.IE ) ? 'mouse' : '');
if ( $.MouseTracker.unprefixedPointerEvents ) {
pointerTypeStr = event.pointerType || (( $.Browser.vendor === $.BROWSERS.IE ) ? 'mouse' : '');
} else { } else {
// IE10 return 'mouse';
// MSPOINTER_TYPE_TOUCH: 0x00000002
// MSPOINTER_TYPE_PEN: 0x00000003
// MSPOINTER_TYPE_MOUSE: 0x00000004
switch( event.pointerType )
{
case 0x00000002:
pointerTypeStr = 'touch';
break;
case 0x00000003:
pointerTypeStr = 'pen';
break;
case 0x00000004:
pointerTypeStr = 'mouse';
break;
default:
pointerTypeStr = 'mouse';
} }
} }
return pointerTypeStr;
/**
* @private
* @inner
*/
function getIsPrimary( event ) {
return ( $.MouseTracker.havePointerEvents ) ? event.isPrimary : true;
} }
@ -1802,8 +1754,6 @@
* @inner * @inner
*/ */
function onClick( tracker, event ) { function onClick( tracker, event ) {
event = $.getEvent( event );
//$.console.log('onClick ' + (tracker.userData ? tracker.userData.toString() : '')); //$.console.log('onClick ' + (tracker.userData ? tracker.userData.toString() : ''));
var eventInfo = { var eventInfo = {
@ -1828,8 +1778,6 @@
* @inner * @inner
*/ */
function onDblClick( tracker, event ) { function onDblClick( tracker, event ) {
event = $.getEvent( event );
//$.console.log('onDblClick ' + (tracker.userData ? tracker.userData.toString() : '')); //$.console.log('onDblClick ' + (tracker.userData ? tracker.userData.toString() : ''));
var eventInfo = { var eventInfo = {
@ -1857,7 +1805,6 @@
//$.console.log( "keydown %s %s %s %s %s", event.keyCode, event.charCode, event.ctrlKey, event.shiftKey, event.altKey ); //$.console.log( "keydown %s %s %s %s %s", event.keyCode, event.charCode, event.ctrlKey, event.shiftKey, event.altKey );
var propagate; var propagate;
if ( tracker.keyDownHandler ) { if ( tracker.keyDownHandler ) {
event = $.getEvent( event );
propagate = tracker.keyDownHandler( propagate = tracker.keyDownHandler(
{ {
eventSource: tracker, eventSource: tracker,
@ -1886,7 +1833,6 @@
//$.console.log( "keyup %s %s %s %s %s", event.keyCode, event.charCode, event.ctrlKey, event.shiftKey, event.altKey ); //$.console.log( "keyup %s %s %s %s %s", event.keyCode, event.charCode, event.ctrlKey, event.shiftKey, event.altKey );
var propagate; var propagate;
if ( tracker.keyUpHandler ) { if ( tracker.keyUpHandler ) {
event = $.getEvent( event );
propagate = tracker.keyUpHandler( propagate = tracker.keyUpHandler(
{ {
eventSource: tracker, eventSource: tracker,
@ -1915,7 +1861,6 @@
//$.console.log( "keypress %s %s %s %s %s", event.keyCode, event.charCode, event.ctrlKey, event.shiftKey, event.altKey ); //$.console.log( "keypress %s %s %s %s %s", event.keyCode, event.charCode, event.ctrlKey, event.shiftKey, event.altKey );
var propagate; var propagate;
if ( tracker.keyHandler ) { if ( tracker.keyHandler ) {
event = $.getEvent( event );
propagate = tracker.keyHandler( propagate = tracker.keyHandler(
{ {
eventSource: tracker, eventSource: tracker,
@ -1944,7 +1889,6 @@
//console.log( "focus %s", event ); //console.log( "focus %s", event );
var propagate; var propagate;
if ( tracker.focusHandler ) { if ( tracker.focusHandler ) {
event = $.getEvent( event );
propagate = tracker.focusHandler( propagate = tracker.focusHandler(
{ {
eventSource: tracker, eventSource: tracker,
@ -1968,7 +1912,6 @@
//console.log( "blur %s", event ); //console.log( "blur %s", event );
var propagate; var propagate;
if ( tracker.blurHandler ) { if ( tracker.blurHandler ) {
event = $.getEvent( event );
propagate = tracker.blurHandler( propagate = tracker.blurHandler(
{ {
eventSource: tracker, eventSource: tracker,
@ -1991,8 +1934,6 @@
function onContextMenu( tracker, event ) { function onContextMenu( tracker, event ) {
//$.console.log('contextmenu ' + (tracker.userData ? tracker.userData.toString() : '') + ' ' + (event.target === tracker.element ? 'tracker.element' : '')); //$.console.log('contextmenu ' + (tracker.userData ? tracker.userData.toString() : '') + ' ' + (event.target === tracker.element ? 'tracker.element' : ''));
event = $.getEvent( event );
var eventInfo = { var eventInfo = {
originalEvent: event, originalEvent: event,
eventType: 'contextmenu', eventType: 'contextmenu',
@ -2040,8 +1981,6 @@
* @inner * @inner
*/ */
function onMouseWheel( tracker, event ) { function onMouseWheel( tracker, event ) {
event = $.getEvent( event );
// Simulate a 'wheel' event // Simulate a 'wheel' event
var simulatedEvent = { var simulatedEvent = {
target: event.target || event.srcElement, target: event.target || event.srcElement,
@ -2120,22 +2059,6 @@
} }
/**
* @private
* @inner
*/
function isParentChild( parent, child )
{
if ( parent === child ) {
return false;
}
while ( child && child !== parent ) {
child = child.parentNode;
}
return child === parent;
}
/** /**
* TODO Never actually seen this event fired, and documentation is tough to find * TODO Never actually seen this event fired, and documentation is tough to find
* @private * @private
@ -2143,7 +2066,6 @@
*/ */
function onLoseCapture( tracker, event ) { function onLoseCapture( tracker, event ) {
//$.console.log('losecapture ' + (tracker.userData ? tracker.userData.toString() : '') + ' ' + (event.target === tracker.element ? 'tracker.element' : '')); //$.console.log('losecapture ' + (tracker.userData ? tracker.userData.toString() : '') + ' ' + (event.target === tracker.element ? 'tracker.element' : ''));
event = $.getEvent( event );
var gPoint = { var gPoint = {
id: $.MouseTracker.mousePointerId, id: $.MouseTracker.mousePointerId,
@ -2166,364 +2088,6 @@
} }
/**
* @private
* @inner
*/
function onMouseEnter( tracker, event ) {
//$.console.log('mouseenter ' + (tracker.userData ? tracker.userData.toString() : '') + ' ' + (event.target === tracker.element ? 'tracker.element' : ''));
event = $.getEvent( event );
var gPoint = {
id: $.MouseTracker.mousePointerId,
type: 'mouse',
isPrimary: true,
currentPos: getMouseAbsolute( event ),
currentTime: $.now()
};
// pointerenter doesn't bubble and is not cancelable, but we call
// preProcessEvent() so it's dispatched to preProcessEventHandler
// if necessary
var eventInfo = {
originalEvent: event,
eventType: 'pointerenter',
pointerType: gPoint.type,
isEmulated: false
};
preProcessEvent( tracker, eventInfo );
updatePointerEnter( tracker, eventInfo, gPoint );
// Simulate mouseover on IE < 9
if ( !$.MouseTracker.havePointerOverOut ) {
handleMouseOver( tracker, event, true );
}
}
/**
* @private
* @inner
*/
function onMouseLeave( tracker, event ) {
//$.console.log('mouseleave ' + (tracker.userData ? tracker.userData.toString() : '') + ' ' + (event.target === tracker.element ? 'tracker.element' : ''));
event = $.getEvent( event );
var gPoint = {
id: $.MouseTracker.mousePointerId,
type: 'mouse',
isPrimary: true,
currentPos: getMouseAbsolute( event ),
currentTime: $.now()
};
// pointerleave doesn't bubble and is not cancelable, but we call
// preProcessEvent() so it's dispatched to preProcessEventHandler
// if necessary
var eventInfo = {
originalEvent: event,
eventType: 'pointerleave',
pointerType: gPoint.type,
isEmulated: false
};
preProcessEvent( tracker, eventInfo );
// Simulate mouseoout on IE < 9
if ( !$.MouseTracker.havePointerOverOut ) {
handleMouseOut( tracker, event, true );
}
updatePointerLeave( tracker, eventInfo, gPoint );
}
/**
* IE9+ only
*
* @private
* @inner
*/
function onMouseOver( tracker, event ) {
//$.console.log('mouseover ' + (tracker.userData ? tracker.userData.toString() : '') + ' ' + (event.target === tracker.element ? 'tracker.element' : ''));
handleMouseOver( tracker, event, false );
}
/**
* @private
* @inner
*/
function handleMouseOver( tracker, event, isEmulated ) {
var gPoint = {
id: $.MouseTracker.mousePointerId,
type: 'mouse',
isPrimary: true,
currentPos: getMouseAbsolute( event ),
currentTime: $.now()
};
var eventInfo = {
originalEvent: event,
eventType: 'pointerover',
pointerType: gPoint.type,
isEmulated: isEmulated
};
preProcessEvent( tracker, eventInfo );
updatePointerOver( tracker, eventInfo, gPoint );
if ( !isEmulated ) {
if ( eventInfo.preventDefault && !eventInfo.defaultPrevented ) {
$.cancelEvent( event );
}
if ( eventInfo.stopPropagation ) {
$.stopEvent( event );
}
}
}
/**
* IE9+ only
*
* @private
* @inner
*/
function onMouseOut( tracker, event ) {
//$.console.log('mouseout ' + (tracker.userData ? tracker.userData.toString() : '') + ' ' + (event.target === tracker.element ? 'tracker.element' : ''));
handleMouseOut( tracker, event, false );
}
/**
* @private
* @inner
*/
function handleMouseOut( tracker, event, isEmulated ) {
var gPoint = {
id: $.MouseTracker.mousePointerId,
type: 'mouse',
isPrimary: true,
currentPos: getMouseAbsolute( event ),
currentTime: $.now()
};
var eventInfo = {
originalEvent: event,
eventType: 'pointerout',
pointerType: gPoint.type,
isEmulated: isEmulated
};
preProcessEvent( tracker, eventInfo );
updatePointerOut( tracker, eventInfo, gPoint );
if ( !isEmulated ) {
if ( eventInfo.preventDefault && !eventInfo.defaultPrevented ) {
$.cancelEvent( event );
}
if ( eventInfo.stopPropagation ) {
$.stopEvent( event );
}
}
}
/**
* Returns a W3C DOM level 3 standard button value given an event.button property:
* -1 == none, 0 == primary/left, 1 == middle, 2 == secondary/right, 3 == X1/back, 4 == X2/forward, 5 == eraser (pen)
* @private
* @inner
*/
function getStandardizedButton( button ) {
if ( $.Browser.vendor === $.BROWSERS.IE && $.Browser.version < 9 ) {
// On IE 8, 0 == none, 1 == left, 2 == right, 3 == left and right, 4 == middle, 5 == left and middle, 6 == right and middle, 7 == all three
// TODO: Support chorded (multiple) button presses on IE 8?
if ( button === 1 ) {
return 0;
} else if ( button === 2 ) {
return 2;
} else if ( button === 4 ) {
return 1;
} else {
return -1;
}
} else {
return button;
}
}
/**
* @private
* @inner
*/
function onMouseDown( tracker, event ) {
var gPoint;
event = $.getEvent( event );
//$.console.log('onMouseDown ' + (tracker.userData ? tracker.userData.toString() : ''));
gPoint = {
id: $.MouseTracker.mousePointerId,
type: 'mouse',
isPrimary: true,
currentPos: getMouseAbsolute( event ),
currentTime: $.now()
};
var eventInfo = {
originalEvent: event,
eventType: 'pointerdown',
pointerType: gPoint.type,
isEmulated: false
};
preProcessEvent( tracker, eventInfo );
updatePointerDown( tracker, eventInfo, gPoint, getStandardizedButton( event.button ) );
if ( eventInfo.preventDefault && !eventInfo.defaultPrevented ) {
$.cancelEvent( event );
}
if ( eventInfo.stopPropagation ) {
$.stopEvent( event );
}
if ( eventInfo.shouldCapture ) {
//$.stopEvent( event );
//$.console.log('mousedown calling capturePointer() ' + (tracker.userData ? tracker.userData.toString() : '') + ' ' + (event.target === tracker.element ? 'tracker.element' : ''));
capturePointer( tracker, gPoint );
}
}
/**
* @private
* @inner
*/
function onMouseUp( tracker, event ) {
handleMouseUp( tracker, event );
}
/**
* This handler is attached to the window object (on the capture phase) to emulate mouse capture.
* onMouseUp is still attached to the tracked element, so stop propagation to avoid processing twice.
*
* @private
* @inner
*/
function onMouseUpCaptured( tracker, event ) {
handleMouseUp( tracker, event );
$.stopEvent( event );
}
/**
* @private
* @inner
*/
function handleMouseUp( tracker, event ) {
var gPoint;
event = $.getEvent( event );
//$.console.log('onMouseUp ' + (tracker.userData ? tracker.userData.toString() : ''));
gPoint = {
id: $.MouseTracker.mousePointerId,
type: 'mouse',
isPrimary: true,
currentPos: getMouseAbsolute( event ),
currentTime: $.now()
};
var eventInfo = {
originalEvent: event,
eventType: 'pointerup',
pointerType: gPoint.type,
isEmulated: false
};
preProcessEvent( tracker, eventInfo );
updatePointerUp( tracker, eventInfo, gPoint, getStandardizedButton( event.button ) );
if ( eventInfo.preventDefault && !eventInfo.defaultPrevented ) {
$.cancelEvent( event );
}
if ( eventInfo.stopPropagation ) {
$.stopEvent( event );
}
if ( eventInfo.shouldReleaseCapture ) {
//$.stopEvent( event );
releasePointer( tracker, gPoint );
}
}
/**
* @private
* @inner
*/
function onMouseMove( tracker, event ) {
handleMouseMove( tracker, event );
}
/**
* This handler is attached to the window object (on the capture phase) to emulate mouse capture.
* onMouseMove is still attached to the tracked element, so stop propagation to avoid processing twice.
*
* @private
* @inner
*/
function onMouseMoveCaptured( tracker, event ) {
handleMouseMove( tracker, event );
$.stopEvent( event );
}
/**
* @private
* @inner
*/
function handleMouseMove( tracker, event ) {
var gPoint;
event = $.getEvent( event );
gPoint = {
id: $.MouseTracker.mousePointerId,
type: 'mouse',
isPrimary: true,
currentPos: getMouseAbsolute( event ),
currentTime: $.now()
};
var eventInfo = {
originalEvent: event,
eventType: 'pointermove',
pointerType: gPoint.type,
isEmulated: false
};
preProcessEvent( tracker, eventInfo );
updatePointerMove( tracker, eventInfo, gPoint );
if ( eventInfo.preventDefault && !eventInfo.defaultPrevented ) {
$.cancelEvent( event );
}
if ( eventInfo.stopPropagation ) {
$.stopEvent( event );
}
}
/** /**
* @private * @private
* @inner * @inner
@ -2783,27 +2347,20 @@
/** /**
* Note: Called for both pointer events and legacy mouse events!
*
* @private * @private
* @inner * @inner
*/ */
function onPointerEnter( tracker, event ) { function onPointerEnter( tracker, event ) {
handlePointerEnter( tracker, event, false );
}
/**
* @private
* @inner
*/
function handlePointerEnter( tracker, event, isEmulated ) {
var gPoint; var gPoint;
//$.console.log('pointerenter ' + (tracker.userData ? tracker.userData.toString() : '')); //$.console.log('pointerenter ' + (tracker.userData ? tracker.userData.toString() : ''));
gPoint = { gPoint = {
id: event.pointerId, id: getPointerId( event ),
type: getPointerType( event ), type: getPointerType( event ),
isPrimary: event.isPrimary, isPrimary: getIsPrimary( event ),
currentPos: getMouseAbsolute( event ), currentPos: getMouseAbsolute( event ),
currentTime: $.now() currentTime: $.now()
}; };
@ -2815,7 +2372,7 @@
originalEvent: event, originalEvent: event,
eventType: 'pointerenter', eventType: 'pointerenter',
pointerType: gPoint.type, pointerType: gPoint.type,
isEmulated: isEmulated isEmulated: false
}; };
preProcessEvent( tracker, eventInfo ); preProcessEvent( tracker, eventInfo );
@ -2824,27 +2381,20 @@
/** /**
* Note: Called for both pointer events and legacy mouse events!
*
* @private * @private
* @inner * @inner
*/ */
function onPointerLeave( tracker, event ) { function onPointerLeave( tracker, event ) {
handlePointerLeave( tracker, event, false );
}
/**
* @private
* @inner
*/
function handlePointerLeave( tracker, event, isEmulated ) {
var gPoint; var gPoint;
//$.console.log('pointerleave ' + (tracker.userData ? tracker.userData.toString() : '')); //$.console.log('pointerleave ' + (tracker.userData ? tracker.userData.toString() : ''));
gPoint = { gPoint = {
id: event.pointerId, id: getPointerId( event ),
type: getPointerType( event ), type: getPointerType( event ),
isPrimary: event.isPrimary, isPrimary: getIsPrimary( event ),
currentPos: getMouseAbsolute( event ), currentPos: getMouseAbsolute( event ),
currentTime: $.now() currentTime: $.now()
}; };
@ -2856,7 +2406,7 @@
originalEvent: event, originalEvent: event,
eventType: 'pointerleave', eventType: 'pointerleave',
pointerType: gPoint.type, pointerType: gPoint.type,
isEmulated: isEmulated isEmulated: false
}; };
preProcessEvent( tracker, eventInfo ); preProcessEvent( tracker, eventInfo );
@ -2865,6 +2415,8 @@
/** /**
* Note: Called for both pointer events and legacy mouse events!
*
* @private * @private
* @inner * @inner
*/ */
@ -2872,9 +2424,9 @@
//$.console.log('pointerover ' + (tracker.userData ? tracker.userData.toString() : '') + ' ' + (event.target === tracker.element ? 'tracker.element' : '')); //$.console.log('pointerover ' + (tracker.userData ? tracker.userData.toString() : '') + ' ' + (event.target === tracker.element ? 'tracker.element' : ''));
var gPoint = { var gPoint = {
id: event.pointerId, id: getPointerId( event ),
type: getPointerType( event ), type: getPointerType( event ),
isPrimary: event.isPrimary, isPrimary: getIsPrimary( event ),
currentPos: getMouseAbsolute( event ), currentPos: getMouseAbsolute( event ),
currentTime: $.now() currentTime: $.now()
}; };
@ -2887,13 +2439,6 @@
}; };
preProcessEvent( tracker, eventInfo ); preProcessEvent( tracker, eventInfo );
// If on IE 10, simulate MSPointerEnter
if ( !$.MouseTracker.unprefixedPointerEvents &&
event.currentTarget !== event.relatedTarget &&
!isParentChild( event.currentTarget, event.relatedTarget ) ) {
handlePointerEnter( tracker, event, true );
}
updatePointerOver( tracker, eventInfo, gPoint ); updatePointerOver( tracker, eventInfo, gPoint );
if ( eventInfo.preventDefault && !eventInfo.defaultPrevented ) { if ( eventInfo.preventDefault && !eventInfo.defaultPrevented ) {
@ -2906,6 +2451,8 @@
/** /**
* Note: Called for both pointer events and legacy mouse events!
*
* @private * @private
* @inner * @inner
*/ */
@ -2913,9 +2460,9 @@
//$.console.log('pointerout ' + (tracker.userData ? tracker.userData.toString() : '') + ' ' + (event.target === tracker.element ? 'tracker.element' : '')); //$.console.log('pointerout ' + (tracker.userData ? tracker.userData.toString() : '') + ' ' + (event.target === tracker.element ? 'tracker.element' : ''));
var gPoint = { var gPoint = {
id: event.pointerId, id: getPointerId( event ),
type: getPointerType( event ), type: getPointerType( event ),
isPrimary: event.isPrimary, isPrimary: getIsPrimary( event ),
currentPos: getMouseAbsolute( event ), currentPos: getMouseAbsolute( event ),
currentTime: $.now() currentTime: $.now()
}; };
@ -2930,13 +2477,6 @@
updatePointerOut( tracker, eventInfo, gPoint ); updatePointerOut( tracker, eventInfo, gPoint );
// If on IE 10, simulate MSPointerLeave
if ( !$.MouseTracker.unprefixedPointerEvents &&
event.currentTarget !== event.relatedTarget &&
!isParentChild( event.currentTarget, event.relatedTarget ) ) {
handlePointerLeave( tracker, event, true );
}
if ( eventInfo.preventDefault && !eventInfo.defaultPrevented ) { if ( eventInfo.preventDefault && !eventInfo.defaultPrevented ) {
$.cancelEvent( event ); $.cancelEvent( event );
} }
@ -2947,6 +2487,8 @@
/** /**
* Note: Called for both pointer events and legacy mouse events!
*
* @private * @private
* @inner * @inner
*/ */
@ -2959,9 +2501,9 @@
// Most browsers implicitly capture touch pointer events // Most browsers implicitly capture touch pointer events
// Note no IE versions have element.hasPointerCapture() so no implicit // Note no IE versions have element.hasPointerCapture() so no implicit
// pointer capture possible // pointer capture possible
var implicitlyCaptured = (tracker.element.hasPointerCapture && var implicitlyCaptured = ($.MouseTracker.havePointerEvents &&
$.Browser.vendor !== $.BROWSERS.IE && tracker.element.hasPointerCapture &&
$.MouseTracker.unprefixedPointerEvents) ? $.Browser.vendor !== $.BROWSERS.IE) ?
tracker.element.hasPointerCapture(event.pointerId) : false; tracker.element.hasPointerCapture(event.pointerId) : false;
// if (implicitlyCaptured) { // if (implicitlyCaptured) {
// $.console.log('pointerdown implicitlyCaptured ' + (tracker.userData ? tracker.userData.toString() : '') + ' ' + (event.target === tracker.element ? 'tracker.element' : '')); // $.console.log('pointerdown implicitlyCaptured ' + (tracker.userData ? tracker.userData.toString() : '') + ' ' + (event.target === tracker.element ? 'tracker.element' : ''));
@ -2970,9 +2512,9 @@
// } // }
gPoint = { gPoint = {
id: event.pointerId, id: getPointerId( event ),
type: getPointerType( event ), type: getPointerType( event ),
isPrimary: event.isPrimary, isPrimary: getIsPrimary( event ),
currentPos: getMouseAbsolute( event ), currentPos: getMouseAbsolute( event ),
currentTime: $.now() currentTime: $.now()
}; };
@ -3004,6 +2546,8 @@
/** /**
* Note: Called for both pointer events and legacy mouse events!
*
* @private * @private
* @inner * @inner
*/ */
@ -3013,6 +2557,8 @@
/** /**
* Note: Called for both pointer events and legacy mouse events!
*
* This handler is attached to the window object (on the capture phase) to emulate mouse capture. * This handler is attached to the window object (on the capture phase) to emulate mouse capture.
* onPointerUp is still attached to the tracked element, so stop propagation to avoid processing twice. * onPointerUp is still attached to the tracked element, so stop propagation to avoid processing twice.
* *
@ -3029,6 +2575,8 @@
/** /**
* Note: Called for both pointer events and legacy mouse events!
*
* @private * @private
* @inner * @inner
*/ */
@ -3038,9 +2586,9 @@
//$.console.log('onPointerUp ' + (tracker.userData ? tracker.userData.toString() : '')); //$.console.log('onPointerUp ' + (tracker.userData ? tracker.userData.toString() : ''));
gPoint = { gPoint = {
id: event.pointerId, id: getPointerId( event ),
type: getPointerType( event ), type: getPointerType( event ),
isPrimary: event.isPrimary, isPrimary: getIsPrimary( event ),
currentPos: getMouseAbsolute( event ), currentPos: getMouseAbsolute( event ),
currentTime: $.now() currentTime: $.now()
}; };
@ -3073,6 +2621,8 @@
/** /**
* Note: Called for both pointer events and legacy mouse events!
*
* @private * @private
* @inner * @inner
*/ */
@ -3082,6 +2632,8 @@
/** /**
* Note: Called for both pointer events and legacy mouse events!
*
* This handler is attached to the window object (on the capture phase) to emulate mouse capture. * This handler is attached to the window object (on the capture phase) to emulate mouse capture.
* onPointerMove is still attached to the tracked element, so stop propagation to avoid processing twice. * onPointerMove is still attached to the tracked element, so stop propagation to avoid processing twice.
* *
@ -3098,6 +2650,8 @@
/** /**
* Note: Called for both pointer events and legacy mouse events!
*
* @private * @private
* @inner * @inner
*/ */
@ -3106,9 +2660,9 @@
var gPoint; var gPoint;
gPoint = { gPoint = {
id: event.pointerId, id: getPointerId( event ),
type: getPointerType( event ), type: getPointerType( event ),
isPrimary: event.isPrimary, isPrimary: getIsPrimary( event ),
currentPos: getMouseAbsolute( event ), currentPos: getMouseAbsolute( event ),
currentTime: $.now() currentTime: $.now()
}; };
@ -3607,27 +3161,6 @@
if ( typeof eventInfo.originalEvent.buttons !== 'undefined' ) { if ( typeof eventInfo.originalEvent.buttons !== 'undefined' ) {
pointsList.buttons = eventInfo.originalEvent.buttons; pointsList.buttons = eventInfo.originalEvent.buttons;
} else {
if ( $.Browser.vendor === $.BROWSERS.IE && $.Browser.version < 9 ) {
if ( buttonChanged === 0 ) {
// Primary
pointsList.buttons += 1;
} else if ( buttonChanged === 1 ) {
// Aux
pointsList.buttons += 4;
} else if ( buttonChanged === 2 ) {
// Secondary
pointsList.buttons += 2;
} else if ( buttonChanged === 3 ) {
// X1 (Back)
pointsList.buttons += 8;
} else if ( buttonChanged === 4 ) {
// X2 (Forward)
pointsList.buttons += 16;
} else if ( buttonChanged === 5 ) {
// Pen Eraser
pointsList.buttons += 32;
}
} else { } else {
if ( buttonChanged === 0 ) { if ( buttonChanged === 0 ) {
// Primary // Primary
@ -3649,7 +3182,6 @@
pointsList.buttons |= 32; pointsList.buttons |= 32;
} }
} }
}
// Only capture and track primary button, pen, and touch contacts // Only capture and track primary button, pen, and touch contacts
if ( buttonChanged !== 0 ) { if ( buttonChanged !== 0 ) {
@ -3772,27 +3304,6 @@
if ( typeof eventInfo.originalEvent.buttons !== 'undefined' ) { if ( typeof eventInfo.originalEvent.buttons !== 'undefined' ) {
pointsList.buttons = eventInfo.originalEvent.buttons; pointsList.buttons = eventInfo.originalEvent.buttons;
} else {
if ( $.Browser.vendor === $.BROWSERS.IE && $.Browser.version < 9 ) {
if ( buttonChanged === 0 ) {
// Primary
pointsList.buttons -= 1;
} else if ( buttonChanged === 1 ) {
// Aux
pointsList.buttons -= 4;
} else if ( buttonChanged === 2 ) {
// Secondary
pointsList.buttons -= 2;
} else if ( buttonChanged === 3 ) {
// X1 (Back)
pointsList.buttons -= 8;
} else if ( buttonChanged === 4 ) {
// X2 (Forward)
pointsList.buttons -= 16;
} else if ( buttonChanged === 5 ) {
// Pen Eraser
pointsList.buttons -= 32;
}
} else { } else {
if ( buttonChanged === 0 ) { if ( buttonChanged === 0 ) {
// Primary // Primary
@ -3814,7 +3325,6 @@
pointsList.buttons ^= ~32; pointsList.buttons ^= ~32;
} }
} }
}
eventInfo.shouldCapture = false; eventInfo.shouldCapture = false;