热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ExtJS事件管理触屏事件和手势事件(TouchEvents&Gestures)

更新记录2022年7月26日发布。2022年7月16日从笔记迁移到博客。ExtJS教程汇总:https:www.cnblogs.comcqpandap16328016.html触屏

更新记录

2022年7月26日 发布。

2022年7月16日 从笔记迁移到博客。


ExtJS教程汇总:https://www.cnblogs.com/cqpanda/p/16328016.html


触屏事件和手势事件(Touch Events & Gestures)

触屏事件说明

除DOM事件和组件事件外,Ext JS还提供手势识别事件功能,常用于移动端

除标准DOM事件外,还支持合成手势事件

有三种主要类型的事件:点击(Pointer)、触摸(Touch)、鼠标(Mouse)

分别支持:开始、移动、结束

Event Touch Pointer Mouse
Start touchstart pointerdown mousedown
Move touchmove pointermove mousemove
Stop touchend pointerup mouseup

通过合成事件、ExtJS框架可以实现更复杂事件

比如拖动、滑动、长按、收缩、旋转和点击

Ext.get('myElement').on('longpress', handlerFunction);

通过拦截所有3种类型的事件,鼠标、点击、触摸


手势事件说明

Ext JS允许任何手势响应任何类型输入

这不仅意味着所有的手势都可以用触摸输入触发

而且所有的单点手势(点击、刷卡等)也可以用鼠标触发

这就产生手势事件系统,可以无缝地跨设备工作,而不必考虑输入类型

目前支持以下类型的手势

image

image

Gesture Events
Tap tap, tapcancel
DoubleTap singletap, doubletap
LongPress longpress
Drag dragstart, drag, dragend, dragcancel
Swipe swipestart, swipe, swipecancel
Pinch pinchstart, pinch, pinchend, pinchcancel
Rotate rotatestart, rotate, rotateend, rotatecancel
EdgeSwipe edgeswipe, edgeswipestart, edgeswipeend, edgeswipecancel

在某些情况下,应用程序只需要在特定类型的输入(鼠标或触摸)触发时监听手势,而忽略另一个。ExtJS在事件对象上提供pointerType属性,用于检测导致事件的输入类型

el.on('drag', function(e) {
if (e.pointerType === 'touch') {
// only handle touch-drag, and ignore mouse-drag
}
});

事件统一化(Event normalization)

To support touch-screen devices, the framework automatically translates touch-screen events into their equivalent mouse events for us. This is called event normalization

As developers, we don’t need to worry about the extra coding

All we have to do is consider the event being used by a mouse

For instance, mousedown will seamlessly be translated to touchdown and pointerdown for us

比如我们写一个鼠标按下事件

myDivElement.on('mousedown', function(e) {
// event handling logic here
});

当在移动设备访问时,ExtJS会自动转为:

myDivElement.on('touchstart', function(e) {
// event handling logic here
});

或者

myDivElement.on('pointerdown', function(e) {
// event handling logic here
});

注意:Ext JS 5 does not perform normalization on events such as mouseover, mouse out, mouse enter, and mouse leave, so when developing applications, we need to look for alternative events to implement these interactions


绑定事件

Ext.get('myDivElement').on('pinch', doSomething);

事件传播(Event Propagation)过程

ExtJS事件通过框架传播的方式与DOM事件在浏览器中自然传播的方式几乎相同

不同之处在于,该框架使用委托事件模型来支持手势识别

这意味着事件在单独的传播阶段传递给DOM元素

该阶段发生在事件已经在DOM级别完成传播之后

image


事件本地传播(Native Propagation)

当浏览器通过DOM层次结构传播事件时,将调用直接附加到DOM元素的事件侦听器

虽然理解Native传播机制很有帮助,但通常应避免在Ext JS中直接附加DOM侦听器,原因如下:

直接侦听器与其他侦听器顺序不一致

从直接连接的侦听器调用stopPropagation可以防止手势识别的发生,并防止随后的合成传播

在某些情况下,可能需要将侦听器直接附加到DOM元素,例如,在将Ext JS与其他框架一起使用时,需要解决一个问题。这可以使用委托事件delegated选项来完成

el.on({
mousedown: function() {
Ext.Msg.alert('mousedown fired - native capture phase');
},
// careful when using delegated: false! this can have unintended side effects
delegated: false,
// use the capture option to listen in the capture phase
capture: true
});

DOM级(Native)的传播分为两个阶段

首先是捕获阶段,在捕获阶段中,事件从dom的顶部被分派到每个元素,从窗口对象开始,一直到作为事件目标的元素

捕获阶段之后,会出现气泡阶段,在此阶段中,事件首先传递到目标元素,然后传递到其祖先,直到到达层次结构的顶部

默认情况下,侦听器在传播的冒泡阶段触发,但也设置在捕获阶段侦听


手势识别阶段(Gesture Recognition)

在本地事件冒泡到Window对象之后,Ext JS执行手势识别

然后它可以合成一个或多个手势事件,然后必须在整个DOM中传播

监听指定的手势

有时,同一层次中的元素可能在监听相互冲突的手势。比如元素A包含元素B

假设元素A正在监听swipe,而它的子元素B正在监听drag

当元素B处理dragstart事件时,它可能希望防止将当前手势解释为swipe

因为元素a的swipe处理程序可能会干扰元素B的drag处理程序

要做到这一点,它必须通过调用事件对象上的claimpostegy方法来“声明”拖动手势

el.on('dragstart', function(e) {
e.claimGesture();
});

合成事件传播阶段(Synthetic Propagation)

手势识别步骤完成后,框架将发送原始的DOM事件(如mousedown或touchmove)以及任何手势事件(如由于DOM事件而被识别的拖动或滑动)

与本地(Native)事件一样,合成事件传播也发生在两个阶段,捕获和气泡阶段

合成传播是框架内所有事件侦听器的默认设置,建议用于使用Ext JS的应用程序

使用合成传播可确保事件与其他事件按正确的顺序触发,并避免由于某种原因停止传播时出现意外

开发人员不需要做任何事情来实现合成传播,因为这是默认的

可以使用以下方式使用合成传播(比如on方法):

el.on('mousedown', function() {
Ext.Msg.alert('mousedown fired - synthetic bubble phase');
});

使用capture选项可用于在捕获阶段侦听:

el.on({
mousedown: function() {
Ext.Msg.alert('mousedown fired - synthetic capture phase');
},
capture: true
});

停止事件传播(Stopping Propagation)

停止事件传播可以在任何点停止,无论是本地(Native) 事件或合成(Synthetic)事件,无论是捕获阶段还是冒泡阶段

这可以防止将事件分发到尚未接收到它的任何元素,并防止执行任何挂起的捕获或气泡阶段

实例:停止事件传播到父元素

parentEl.on('mousedown', function() {
// never fires because child element in bubble phase stops propagation of mousedown
Ext.Msg.alert('mousedown fired on child');
});
el.on('mousedown', function(e) {
Ext.Msg.alert('mousedown fired on child');
// immediately stop propagating the event any further
e.stopPropagation();
});

实例:停止事件传播在捕获阶段

el.on({
mousedown: function(e) {
Ext.Msg.alert('mousedown - capture phase');
//stopping propagation during the capture phase causes the entire
//bubble phase to be skipped
e.stopPropagation();
},
capture: true
});
el.on('mousedown', function() {
// never fires because propagation of mousedown event was stopped prior to
// bubble phase
Ext.Msg.alert('mousedown - bubble phase');
});

浏览器处理的手势(Browser-Handled Gestures)

浏览器会自动处理某些触摸手势,并执行默认操作(如滚动或缩放)

这些动作被称为“触摸动作”,浏览器通常实现以下触摸操作:

Gesture Touch Action

drag (horizontal) 水平滚动(horizontal scroll)

drag (vertical) 垂直滚动(vertical scroll)

pinch 缩放(zoom)

doubletap 缩放(zoom)

ExtJS应用程序为这些手势中的任何一个实现了自己的处理

在需要时可以在处理手势时禁用浏览器的一个或多个默认触摸操作

// instruct the browser not to scroll while "el" is being dragged
el.setTouchAction({
panX: false,
panY: false
});

在处理组件时,通常应该避免直接在其元素上调用setTouchAction,而是使用组件的touchAction选项进行配置

Ext.create('Ext.panel.Panel', {
touchAction: {
panY: false,
body: {
pinchZoom: false
}
},
listeners: {
drag: function(e) {
// handle drag on the panel's main element
},
pinch: {
element: 'body',
fn: function(e) {
// handle pinch on the panel's body element
}
}
}
});

长按拖动(Longpress to Drag)

在触摸设备上,有时很难确定触摸是否应该滚动或拖动对象

确定意图的常用方法是时间阈值

按住元素足够长的时间,手势将转换为拖动而不是滚动

现在可以使用longpress事件上可用的新startDrag方法来实现这一点

el.on('longpress', function(e) {
e.startDrag();
});

在使用Pointer事件时,在浏览器(IE和Edge)上,还必须对元素设置适当的触摸操作,以防止在拖动元素时浏览器滚动

el.setTouchAction({
panX: false,
panY: false
});

在使用Touch 事件时,在浏览器(Chrome和Safari)上,没有必要配置元素的Touch操作以防止滚动。相反,可以在拖动事件对象上调用preventDefault以防止滚动发生

el.on('drag', function(e) {
e.preventDefault();
});

视区缩放(Viewport Zoom)

通常将以下元标记添加到html页面


禁用缩放(不推荐)

本文来自博客园,作者:重庆熊猫,转载请注明原文链接:https://www.cnblogs.com/cqpanda/p/16483350.html



推荐阅读
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • 本文介绍了Cocos2dx学习笔记中的更新函数scheduleUpdate、进度计时器CCProgressTo和滚动视图CCScrollView的用法。详细介绍了scheduleUpdate函数的作用和使用方法,以及schedule函数的区别。同时,还提供了相关的代码示例。 ... [详细]
  • 阿里Treebased Deep Match(TDM) 学习笔记及技术发展回顾
    本文介绍了阿里Treebased Deep Match(TDM)的学习笔记,同时回顾了工业界技术发展的几代演进。从基于统计的启发式规则方法到基于内积模型的向量检索方法,再到引入复杂深度学习模型的下一代匹配技术。文章详细解释了基于统计的启发式规则方法和基于内积模型的向量检索方法的原理和应用,并介绍了TDM的背景和优势。最后,文章提到了向量距离和基于向量聚类的索引结构对于加速匹配效率的作用。本文对于理解TDM的学习过程和了解匹配技术的发展具有重要意义。 ... [详细]
  • Linuxchmod目录权限命令图文详解在Linux文件系统模型中,每个文件都有一组9个权限位用来控制谁能够读写和执行该文件的内容。对于目录来说,执行位的作用是控制能否进入或者通过 ... [详细]
  • Lodop中特殊符号打印设计和预览样式不同的问题解析
    本文主要解析了在Lodop中使用特殊符号打印设计和预览样式不同的问题。由于调用的本机ie引擎版本可能不同,导致在不同浏览器下样式解析不同。同时,未指定文字字体和样式设置也会导致打印设计和预览的差异。文章提出了通过指定具体字体和样式来解决问题的方法,并强调了以打印预览和虚拟打印机测试为准。 ... [详细]
  • Final关键字的含义及用法详解
    本文详细介绍了Java中final关键字的含义和用法。final关键字可以修饰非抽象类、非抽象类成员方法和变量。final类不能被继承,final类中的方法默认是final的。final方法不能被子类的方法覆盖,但可以被继承。final成员变量表示常量,只能被赋值一次,赋值后值不再改变。文章还讨论了final类和final方法的应用场景,以及使用final方法的两个原因:锁定方法防止修改和提高执行效率。 ... [详细]
  • 本文介绍了求解gcdexgcd斐蜀定理的迭代法和递归法,并解释了exgcd的概念和应用。exgcd是指对于不完全为0的非负整数a和b,gcd(a,b)表示a和b的最大公约数,必然存在整数对x和y,使得gcd(a,b)=ax+by。此外,本文还给出了相应的代码示例。 ... [详细]
  • EPICS Archiver Appliance存储waveform记录的尝试及资源需求分析
    本文介绍了EPICS Archiver Appliance存储waveform记录的尝试过程,并分析了其所需的资源容量。通过解决错误提示和调整内存大小,成功存储了波形数据。然后,讨论了储存环逐束团信号的意义,以及通过记录多圈的束团信号进行参数分析的可能性。波形数据的存储需求巨大,每天需要近250G,一年需要90T。然而,储存环逐束团信号具有重要意义,可以揭示出每个束团的纵向振荡频率和模式。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 电销机器人作为一种人工智能技术载体,可以帮助企业提升电销效率并节省人工成本。然而,电销机器人市场缺乏统一的市场准入标准,产品品质良莠不齐。创业者在代理或购买电销机器人时应注意谨防用录音冒充真人语音通话以及宣传技术与实际效果不符的情况。选择电销机器人时需要考察公司资质和产品品质,尤其要关注语音识别率。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 如何去除Win7快捷方式的箭头
    本文介绍了如何去除Win7快捷方式的箭头的方法,通过生成一个透明的ico图标并将其命名为Empty.ico,将图标复制到windows目录下,并导入注册表,即可去除箭头。这样做可以改善默认快捷方式的外观,提升桌面整洁度。 ... [详细]
  •  项目地址https:github.comffmydreamWiCar界面做的很难看,美工方面实在不在行。重点是按钮触摸事件的处理,这里搬了RepeatListener项目代码,例 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了css回到顶部按钮相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 关于extjs开发实战pdf的信息
    本文目录一览:1、extjs实用开发指南2、本 ... [详细]
author-avatar
百万会员XTN_859
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有