在 pc 端模拟移动端 touch 事件,代码来自 Vant
JS
/*** 模拟移动端 touch 事件*/var eventTarget// polyfillsif (!document.createTouch) {document.createTouch = function(view, target, identifier, pageX, pageY, screenX, screenY) {// auto setreturn new Touch(target,identifier,{pageX: pageX,pageY: pageY,screenX: screenX,screenY: screenY,clientX: pageX - window.pageXOffset,clientY: pageY - window.pageYOffset},0,0)}}if (!document.createTouchList) {document.createTouchList = function() {var touchList = TouchList()for (var i = 0; i < arguments.length; i++) {touchList[i] = arguments[i]}touchList.length = arguments.lengthreturn touchList}}/*** create an touch point* @constructor* @param target* @param identifier* @param pos* @param deltaX* @param deltaY* @returns {Object} touchPoint*/var Touch = function Touch(target, identifier, pos, deltaX, deltaY) {deltaX = deltaX || 0deltaY = deltaY || 0this.identifier = identifierthis.target = targetthis.clientX = pos.clientX + deltaXthis.clientY = pos.clientY + deltaYthis.screenX = pos.screenX + deltaXthis.screenY = pos.screenY + deltaYthis.pageX = pos.pageX + deltaXthis.pageY = pos.pageY + deltaY}/*** create empty touchlist with the methods* @constructor* @returns touchList*/function TouchList() {var touchList = []touchList['item'] = function(index) {return this[index] || null}// specified by MozillatouchList['identifiedTouch'] = function(id) {return this[id + 1] || null}return touchList}/*** Simple trick to fake touch event support* this is enough for most libraries like Modernizr and Hammer*/function fakeTouchSupport() {var objs = [window, document.documentElement]var props = ['ontouchstart', 'ontouchmove', 'ontouchcancel', 'ontouchend']for (var o = 0; o < objs.length; o++) {for (var p = 0; p < props.length; p++) {if (objs[o] && objs[o][props[p]] === undefined) {objs[o][props[p]] = null}}}}/*** only trigger touches when the left mousebutton has been pressed* @param touchType* @returns {Function}*/function onMouse(touchType) {return function(ev) {// prevent mouse eventsif (ev.which !== 1) {return}// The EventTarget on which the touch point started when it was first placed on the surface,// even if the touch point has since moved outside the interactive area of that element.// also, when the target doesnt exist anymore, we update itif (ev.type === 'mousedown' || !eventTarget || (eventTarget && !eventTarget.dispatchEvent)) {eventTarget = ev.target}triggerTouch(touchType, ev)// resetif (ev.type === 'mouseup') {eventTarget = null}}}/*** trigger a touch event* @param eventName* @param mouseEv*/function triggerTouch(eventName, mouseEv) {var touchEvent = document.createEvent('Event')touchEvent.initEvent(eventName, true, true)touchEvent.altKey = mouseEv.altKeytouchEvent.ctrlKey = mouseEv.ctrlKeytouchEvent.metaKey = mouseEv.metaKeytouchEvent.shiftKey = mouseEv.shiftKeytouchEvent.touches = getActiveTouches(mouseEv)touchEvent.targetTouches = getActiveTouches(mouseEv)touchEvent.changedTouches = createTouchList(mouseEv)eventTarget.dispatchEvent(touchEvent)}/*** create a touchList based on the mouse event* @param mouseEv* @returns {TouchList}*/function createTouchList(mouseEv) {var touchList = TouchList()touchList.push(new Touch(eventTarget, 1, mouseEv, 0, 0))return touchList}/*** receive all active touches* @param mouseEv* @returns {TouchList}*/function getActiveTouches(mouseEv) {// empty listif (mouseEv.type === 'mouseup') {return TouchList()}return createTouchList(mouseEv)}/*** TouchEmulator initializer*/function TouchEmulator() {fakeTouchSupport()window.addEventListener('mousedown', onMouse('touchstart'), true)window.addEventListener('mousemove', onMouse('touchmove'), true)window.addEventListener('mouseup', onMouse('touchend'), true)}// start distance when entering the multitouch modeTouchEmulator['multiTouchOffset'] = 75new TouchEmulator()
直接引入该文件,pc 端就可以响应移动端的 touchstart
、touchmove
、touchend
事件了 ✨。