跨浏览器多点触控事件处理兼容ie10 winphone

2023-12-07 17:58

本文主要是介绍跨浏览器多点触控事件处理兼容ie10 winphone,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文主要解释了Web开发者如何通过使用IE10中新引入的pointer事件模型、iOS上的touch事件模型以及W3C标准的扩展鼠标事件模型来编写普适的跨浏览器的触控事件处理代码。

  代码部分

  用鼠标来绘图的基本流程简单明了:

var drawingStarted  =   false ;

  
function  DoEvent(eventObject) {

  
if  (eventObject.type  ==   " mousedown " ) {

  drawingStarted 
=   true ;

  startDraw(eventObject.pageX, eventObject.pageY);

  }

  
else   if  (eventObject.type  ==   " mousemove " ) {

  
if  (drawingStarted) {

  extendDraw(eventObject.pageX, eventObject.pageY);

  }

  }

  
else   if  (eventObject.type  ==   " mouseup " ) {

  drawingStarted 
=   false ;

  endDraw();

  }

  }

 

  唯一需要改动以支持IE10的pointer事件的地方就是得注意多点触控可能同时发生(多个点由不同的pointerId区分)。IE10的 pointer模型会触发每个触点的单独的MSPointerDown, MSPointerMove和MSPointerUp事件。

var drawingStarted  =  {};

  
function  DoEvent(eventObject) {

  eventObject.preventManipulation(); 
//  如果不加上这句, 则屏幕的拖动会代替绘图的动作

  var pointerId 
=  eventObject.pointerId;

  
if  (eventObject.type  ==   " MSPointerDown " ) {

  drawingStarted[pointerId] 
=   true ;

  startDraw(pointerId, eventObject.pageX, eventObject.pageY);

  }

  
else   if  (eventObject.type  ==   " MSPointerMove " ) {

  
if  (drawingStarted[pointerId]) {

  extendDraw(pointerId, eventObject.pageX, eventObject.pageY);

  }

  }

  
else   if  (eventObject.type  ==   " MSPointerUp " ) {

  delete drawingStarted[pointerId];

  endDraw(pointerId);

  }

  }

 

  要兼容Apple的iOS的touch事件模型则需要你遍历每一个 touchstart, touchmove, 和touchend事件中的changedTouches。因为在iOS事件模型中,同一个事件中可能包含同时产生的不同状态的触控点。像IE10的 pointer模型一样,我们也需要用唯一的id来区分不同的触控点。

  合并以上三种代码需要注意事件名称和触控点id名称的区别,以及鼠标事件模型中并没有触控点id。在以下合并后的代码中,我也加入了对”move”事件是否实际发生的检查。这是因为在IE10的pointer模型中,如果一个触控点始终被压下但没有移 动,即便产生完全相同的x和y坐标,MSPointerMove事件也会被持续触发。通过过滤这些冗余的“移动”,可以消除这些对 extendDraw()的无谓调用。我是这样实现这个检查的:将上一次的start或move事件中的xy坐标存储到一个lastXY的对象中,然后在 后续的事件中检查这个lastXY。lastXY此时代替了前两段示例代码中的drawingStarted对象。

var lastXY  =  { };
function  DoEvent(eventObject) {
    
//  阻止拖动和缩放使得绘图能够正常进行
    
if  (eventObject.preventManipulation)
        eventObject.preventManipulation();
    
else
        eventObject.preventDefault();

    
//  如果存在changedTouches数组,则使用它,否则使用eventObject创建一组
    var touchPoints 
=  (typeof eventObject.changedTouches ! =   ' undefined') ? eventObject.changedTouches : [eventObject];
     for  (var i  =   0 ; i  <  touchPoints.length;  ++ i) {
        var touchPoint 
=  touchPoints[i];
        
//  获取唯一的touchPoint id,如果不存在,则使用1作为默认值
        var touchPointId 
=  (typeof touchPoint.identifier ! =   ' undefined') ? touchPoint.identifier : (typeof touchPoint.pointerId != 'undefined') ? touchPoint.pointerId : 1;

        
if  (eventObject.type.match( / (down|start)$ / i)) {
            
//  处理mousedown, MSPointerDown,以及touchstart事件
            lastXY[touchPointId] 
=  { x: touchPoint.pageX, y: touchPoint.pageY };
            startDraw(touchPointId, touchPoint.pageX, touchPoint.pageY);
        }
        
else   if  (eventObject.type.match( / move$ / i)) {
            
//  处理mousemove, MSPointerMove,以及touchmove事件
            
if  (lastXY[touchPointId]  & # 038 ; &  !(lastXY[touchPointId].x  ==  touchPoint.pageX  & # 038 ; &  lastXY[touchPointId].y  ==  touchPoint.pageY)) {
                lastXY[touchPointId] 
=  { x: touchPoint.pageX, y: touchPoint.pageY };
                extendDraw(touchPointId, touchPoint.pageX, touchPoint.pageY);
            }
        }
        
else   if  (eventObject.type.match( / (up| end )$ / i)) {
            
//  处理mouseup, MSPointerUp,以及touchend事件
            delete lastXY[touchPointId];
            endDraw(touchPointId);
        }
    }
}

       上面这个例子略去了注册和接受事件以及确保它们被应用在绘图目标上的代码。要使这些代码真正能在所有的浏览器——包括IE9之前的浏览器上跑起来,则还需要一些额外的工作。感兴趣的朋友可以阅读这个跨浏览器的多点触控绘图类的最终代码。
通过同时为鼠标和触控设备编码,web开发者可以确保他们的站点工作在所有的浏览器上——无论是PC,平板还是手机。

 英文原文http://blogs.msdn.com/b/ie/archive/2011/10/19/handling-multi-touch-and-mouse-input-in-all-browsers.aspx

这篇关于跨浏览器多点触控事件处理兼容ie10 winphone的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/466815

相关文章

JavaScript DOM操作与事件处理方法

《JavaScriptDOM操作与事件处理方法》本文通过一系列代码片段,详细介绍了如何使用JavaScript进行DOM操作、事件处理、属性操作、内容操作、尺寸和位置获取,以及实现简单的动画效果,涵... 目录前言1. 类名操作代码片段代码解析2. 属性操作代码片段代码解析3. 内容操作代码片段代码解析4.

poj 1981 单位圆套最多点

题意: 给n(300)个点,用单位圆去套他们,问最多能套多少个点。 解析: 点击打开链接 直接当作单位圆套最多点的模板吧,用极脚来排序。 代码: #pragma comment(linker, "/STACK:1677721600")#include <map>#include <set>#include <cmath>#include <queue>

zeroclipboard 粘贴板的应用示例, 兼容 Chrome、IE等多浏览器

zeroclipboard单个复制按钮和多个复制按钮的实现方法 最近网站改版想让复制代码功能在多个浏览器上都可以实现,最近看网上不少说我们的代码复制功能不好用的,我们最近将会增加代码高亮等功能,希望大家多多支持我们 zeroclipboard是一个跨浏览器的库类 它利用 Flash 进行复制,所以只要浏览器装有 Flash 就可以运行,而且比 IE 的

微软正式推出 Spartan 斯巴达浏览器

作为用于替代 IE 浏览器的下一代继任者,微软的 Project Spartan 斯巴达浏览器可算是吊足了玩家们的胃口!如今,在最新的 Windows 10 Build 10049 版本起,它终于正式登场了。 斯巴达浏览器搭载了全新的渲染引擎、新的用户界面并集成了 Cortana 语音助手。功能上新增了稍后阅读列表、阅读视图、F12开发者工具、支持网页注释 (手写涂鸦),可以保存到 O

PC与android平板通过浏览器监控Verybot的视频

下面这个视频是PC与android平板通过浏览器监控Verybot的视频:           http://v.youku.com/v_show/id_XNjYzNzYyMTIw.html

你的应用与Solaris 11兼容吗?

用户现在可以下载开发者预览版的Solaris 11,它内置在名为Solaris 11 Express的软件产品中,甲骨文已在去年11月发布了该产品。如今,甲骨文发布了一款新的甲骨文Solaris 11兼容性检查工具(Oracle Solaris 11 Compatibility Checker Tool),加强了Solaris 11方面的开发工作。对于甲骨文和Solaris的用户来说,这是重

搜狗浏览器打开CSDN博客排版错乱问题解决

之前发生过几次,不知道什么原因。 今天一直用着好好的,打开一个csdn连接,显示404,博文被删除了,于是就用百度快照打开试试,百度快照打开显示的排版很乱也没找到有用信息。 后面再浏览CSDN博客就排版错乱,显示一个大大二维码图片。 尝试删除IE缓存无效,使用谷歌浏览是好的。 基本锁定就是搜狗缓存导致的,于是找如何删除搜狗缓存   清除后恢复正常

240907-Gradio插入Mermaid流程图并自适应浏览器高度

A. 最终效果 B. 示例代码 import gradio as grmermaid_code = """<iframe srcdoc='<!DOCTYPE html><html><head><meta charset="utf-8" /><meta name="viewport" content="width=device-width" /><title>My static Spa

Jasperreports+jaspersoft studio 实现单个或多个jrxml(jasper)文件生成一个pdf文件,并利用Servlet发送该pdf文件到浏览器中展示

Jasperreports+jaspersoft studio 实现单个或多个jrxml(jasper)文件生成一个pdf文件,并利用Servlet发送该pdf文件到浏览器中展示; 代码如下: Demo07.jrxml <?xml version="1.0" encoding="UTF-8"?><!-- Created with Jaspersoft Studio version 6.6.

关于iReport5.6.0无法正常启动或者闪退或者JDK8不兼容的解决方案

我下载了iReport5.6.0 版本的,启动不起来;jdk 1.8 下载iReport5.6.0地址:https://download.csdn.net/download/u013456370/10589765 参考链接:https://blog.csdn.net/erlian1992/article/details/76359191?locationNum=6&fps=1 如果是停留在这