mirror of
https://github.com/openseadragon/openseadragon.git
synced 2024-11-23 21:56:10 +03:00
135 lines
4.3 KiB
JavaScript
135 lines
4.3 KiB
JavaScript
/* global TouchUtil, $ */
|
|
|
|
(function () {
|
|
|
|
var touches,
|
|
identifier,
|
|
target;
|
|
|
|
// ----------
|
|
window.TouchUtil = {
|
|
reset: function () {
|
|
touches = [];
|
|
identifier = 0;
|
|
},
|
|
|
|
initTracker: function ( tracker ) {
|
|
// for testing in other touch-enabled browsers
|
|
if ( !('ontouchstart' in window) ) {
|
|
tracker.setTracking( false );
|
|
OpenSeadragon.MouseTracker.subscribeEvents.push( 'touchstart', 'touchend' );
|
|
tracker.setTracking( true );
|
|
}
|
|
|
|
target = tracker.element;
|
|
},
|
|
|
|
resetTracker: function ( tracker ) {
|
|
// for testing in other touch-enabled browsers
|
|
if ( !('ontouchstart' in window) ) {
|
|
tracker.setTracking( false );
|
|
['touchstart', 'touchend'].forEach(function ( type ) {
|
|
var index = OpenSeadragon.MouseTracker.subscribeEvents.indexOf( type );
|
|
if ( index > -1 ) {
|
|
OpenSeadragon.MouseTracker.subscribeEvents.splice( index, 1 );
|
|
}
|
|
});
|
|
tracker.setTracking( true );
|
|
}
|
|
|
|
target = null;
|
|
},
|
|
|
|
start: function () {
|
|
var touch,
|
|
event,
|
|
newTouches = [];
|
|
|
|
for ( var i = 0; i < arguments.length; i++ ) {
|
|
touch = createTouch(
|
|
target.offsetLeft + arguments[ i ][ 0 ],
|
|
target.offsetTop + arguments[ i ][ 1 ]
|
|
);
|
|
|
|
touches.push( touch );
|
|
newTouches.push( touch );
|
|
}
|
|
|
|
event = createTouchEvent( 'touchstart', newTouches );
|
|
target.dispatchEvent( event );
|
|
return newTouches.length === 1 ? newTouches[ 0 ] : newTouches;
|
|
},
|
|
|
|
end: function ( changedTouches ) {
|
|
if ( !$.isArray( changedTouches ) ) {
|
|
changedTouches = [ changedTouches ];
|
|
}
|
|
|
|
var event;
|
|
touches = touches.filter(function ( touch ) {
|
|
return changedTouches.indexOf( touch ) === -1;
|
|
});
|
|
|
|
event = createTouchEvent( 'touchend', changedTouches );
|
|
target.dispatchEvent( event );
|
|
}
|
|
|
|
};
|
|
|
|
// ----------
|
|
function createTouch( x, y ) {
|
|
try {
|
|
// new spec
|
|
return new Touch({
|
|
identifier: identifier++,
|
|
target: target,
|
|
pageX: target.offsetLeft + x,
|
|
pageY: target.offsetTop + y
|
|
} );
|
|
} catch (e) {
|
|
// legacy
|
|
return document.createTouch( window, target, identifier++, x, y, x, y );
|
|
}
|
|
}
|
|
|
|
function createTouchList( touches ) {
|
|
// legacy
|
|
return document.createTouchList.apply( document, touches );
|
|
}
|
|
|
|
function createTouchEvent( type, changedTouches ) {
|
|
try {
|
|
// new spec
|
|
return new TouchEvent( type, {
|
|
view: window,
|
|
bubbles: true,
|
|
cancelable: true,
|
|
touches: touches,
|
|
targetTouches: touches,
|
|
changedTouches: changedTouches
|
|
} );
|
|
} catch (e) {
|
|
// legacy
|
|
var touchEvent = document.createEvent( 'TouchEvent' );
|
|
var touch1 = changedTouches[ 0 ];
|
|
touchEvent.initTouchEvent(
|
|
createTouchList( touches ), // touches
|
|
createTouchList( touches ), // targetTouches
|
|
createTouchList( changedTouches ), // changedTouches
|
|
type, // type
|
|
window, // view
|
|
touch1.screenX, // screenX
|
|
touch1.screenY, // screenY
|
|
touch1.clientX, // clientX
|
|
touch1.clientY, // clientY
|
|
false, // ctrlKey
|
|
false, // altKey
|
|
false, // shiftKey
|
|
false // metaKey
|
|
);
|
|
return touchEvent;
|
|
}
|
|
}
|
|
|
|
})();
|