创建可被取消的默认事件处理器
[重要说明]:本小节内容由网友闲云野鹤倾情提供,谢谢他的分享。
默认事件处理器用于在组件内部对某些事件进行默认动作相应,这在很多组件里面都是很普遍的。这样组件可以触发某些事件,默认对触发的事件进行处理,比如在可关闭的TitleWindow窗口中,我们单击顶部的关闭按钮,TitleWindow内部的默认关闭事件处理器对该事件进行响应,执行关闭当前窗口的操作。这样存在一种情况,有时候我们需要在关闭窗口前先提示用户将要关闭窗口,是否继续等类似的提示,如果用户确认需要关闭,那么就关闭,否则不关闭。对于后面的一种情况,我们需要阻止默认事件处理器的执行。类似的情况同样发生在我们自行开发的一些Flex组件中,所以有必要讨论一下如何创建一个可被取消的默认事件处理器。
首先,我们要在组件外部自定义对事件的处理器,而且这个处理器的执行优先级要高于默认的事件处理器。也就是说,组件内部的事件处理器的优先级要低于外部的处理器。对于组件外部的事件处理器来说,应有某些方法可以阻止默认事件处理器的执行,具体的实现过程有4个步骤:
1)在组件内部,创建事件时要设置该事件为可被取消,也就是要设置事件的cancelable标志为true,该标志对应事件构造函数Event()的第三个参数。
2)在组件内部,添加默认事件侦听处理器时要使用EventPriority.DEFAULT_HANDLER优先级,于是该事件的默认处理器的优先级就低于普通的事件处理器的优先级。
3)在组件外部,在自定义的事件处理器代码中,要调用event.preventDefault()方法来阻止事件在组件内部的默认事件处理器的执行。
4)在组件内部,默认的事件处理器代码中使用event.isDefaultPrevented()来检测用户是否阻止了默认事件处理。
代码清单1-7是演示代码,在组件的内部,我们定义了一个alarm事件该事件的默认处理器用于处理alarm事件。
代码清单1-7 停止默认事件处理器的演示代码
- package
- {
- importflash.events.Event;
- importmx.controls.Alert;
- importmx.core.EventPriority;
- importmx.core.UIComponent;
-
[Event(name="alarm",type="flash.events.Event")]
- publicclassMyComponentextendsUIComponent
- {
- publicfunctionMyComponent()
- {
- //为alarm事件添加默认事件侦听。
- /**该事件的优先级为:DEFAULT_HANDLER。这是一
个低优先级,以使得普通的事件侦听可以*先执行,从而用户可
以通过调用event.preventDefault()来取消事件的默认处理行为。*/
- addEventListener("alarm",handleAlarm,
false,EventPriority.DEFAULT_HANDLER,true);
- }
- //一种简单方法,触发一个可被取消的带默认事件处理的事件。
- publicfunctiontriggerAlarm():void
- {
- /**创建一个新的alarm事件。这里的关键点为构造函数的第3个参数,
- *该参数表示该事件可以通过event.preventDefault()来取消。*/
- dispatchEvent(newEvent("alarm",false,true));
- }
- //"alarm"事件的默认处理
- protectedfunctionhandleAlarm(event:Event):void
- {
- //检测该事件是否被其他的事件侦听器阻止了默认处理行为。
- if(!event.isDefaultPrevented())
- ...{
- //事件没有被取消。
- Alert.show("MyComponent内部Alarm事件默认处理,handleAlarm");
- }
- }
- }//endclass
- }//endpackage
代码清单1-8是一段简单的测试代码,我们定义了一个alarm事件的侦听器,在其内部调用event.preventDefault()来阻止该事件的默认执行行为。
代码清单1-8 测试代码
- <?xmlversion="1.0"encoding="utf-8"?>
-
<mx:Applicationxmlns:mx=http://www.adobe.com/2006/mxml
layout="vertical"xmlns:local="*">
-
<mx:Script>
-
<![CDATA[
- protectedfunctionhandleAlarm(event:Event):void
- ...{
- //为了便于演示,在界面上做一个标记
- 来表示是否要阻止默认事件处理的执行。
- if(preventToggle.selected)
- ...{
- trace("Defaultbehaviorisprevented");
- event.preventDefault();
- }
- else
- ...{
- trace("Wedidn"tpreventthedefault
behavior,sowe"llseethealertfromMyComponent.");
- }
- }
- ]]>
-
</mx:Script>
-
<mx:Buttonlabel="触发事件"click="myComp.triggerAlarm();"/>
-
<mx:CheckBoxid="preventToggle"label="禁止默认行为?"selected="true"/>
-
<local:MyComponentid="myComp"alarm="handleAlarm(event);"/>
-
</mx:Application>
怎么样,很简单吧!这是一个简单但是很有用的技巧,创建可被取消的默认事件行为是Flex组件开发的一个重要部分。
分享到:
相关推荐
除了target属性和srcElement属性外,event对象还提供了一系列与事件相关的其他属性和方法,如type(事件类型)、bubbles(事件是否冒泡)、preventDefault(取消事件的默认行为)和stopPropagation(停止事件进一步...
默认情况下,事件会从顶级View组开始向下分发,如果某个View或ViewGroup不消费事件,事件会返回上一级,直到被处理或者到达根视图。 6. Android生命周期: Activity和Fragment的生命周期与事件处理紧密相关,例如...
4. **touchcancel**:当系统需要取消正在进行的触摸事件时触发。这可能是因为系统资源紧张,或者有更高优先级的事件需要处理。此事件较少见,但在开发中仍需考虑到其可能带来的影响。 ### 触摸事件属性 每个触摸...
4. **高仿微信通讯录功能**:实现类似微信通讯录的功能,需要创建一个可滚动的列表,每个联系人项都是一个可触摸的元素。可以使用`FlatList`组件来实现长列表的高效渲染。每个列表项包含姓名、头像等信息,并绑定`...
此外,工作流可以被取消,因此活动需要检查取消标志并适当地响应,可能是清理已订阅的事件或者抛出`WorkflowApplicationAbortedException`异常。 在工作流设计中,事件活动可以与其他活动结合使用,例如与条件活动...
通过在事件处理器中设置`e.Handled`属性为`true`,可以阻止默认的键盘输入行为。此外,为了确保键盘在一段时间内不起作用,我们可以使用定时器(`System.Windows.Forms.Timer`)来控制`KeyPress`事件处理器的启用和...
使用libvlc_event_attach()函数将事件处理器与特定的事件类型关联起来: ```c libvlc_event_manager_t *em = libvlc_media_player_event_manager(p_media_player); libvlc_event_attach(em, libvlc_...
弹出框内会包含两个按钮,一个表示确认,一个表示取消,每个按钮都有自己的点击事件处理器。当用户做出选择后,通过JavaScript更新页面状态或者与服务器进行通信。 总的来说,"jQuery点击弹出确认或取消删除特效"是...
- **`cancelable`**:布尔值,表示该事件是否可以通过`preventDefault()`方法取消默认行为。 ### 2. 控制事件流程的方法 - **`preventDefault()`**:阻止事件的默认行为。例如,在链接点击时阻止页面跳转。 - **`...
- `dragover`事件处理函数:当拖动元素进入可放下区域时触发,改变边框颜色以提供视觉反馈,并取消默认的禁止放置行为。 - `dragleave`事件处理函数:当拖动元素离开可放下区域时触发,恢复边框颜色。 - `...
这减少了内存消耗,因为只需一个全局事件处理器,同时允许在组件挂载和卸载时统一处理订阅和取消订阅。 - React事件是合成事件(SyntheticEvent),它不是浏览器原生事件,而是React自己实现的,旨在提供跨浏览器...
这可以通过多种JavaScript函数实现,如window.confirm(),这是一种简单而直接的方式,用于创建带有确定和取消按钮的对话框。 首先,我们可以使用HTML中的标签结合onclick事件处理器来实现这一功能。当用户点击链接...
如果需要同时取消默认行为和阻止事件冒泡,可以结合event.stopPropagation()使用。 - 使用event.stopPropagation()方法:这个方法用来阻止事件继续传播到父级元素,从而停止冒泡过程。 3. jQuery中的实例: - ...
事件处理器可设定优先级,通常默认为0,高优先级的处理器将优先接收到事件。此外,`EventDispatcher`提供了如`setTouchPriority`和`setKeyPriority`等方法,允许开发者动态调整处理器的优先级,从而优化事件处理流程...
正确地阻止冒泡可以提高页面性能,防止不必要的事件处理器被触发,而正确地阻止默认行为可以确保用户交互按预期进行,避免不必要的页面跳转或其他副作用。总之,事件的冒泡和默认行为控制是前端开发中十分核心的概念...
这里的`Grid`用于包裹每个列表项,同时设置了一个`RightTapped`事件处理器`GridColection_OnRightTapped`,当用户右键点击列表项时,该事件会被触发。 接下来,我们需要在后台代码中处理`GridColection_...
- **事件处理器**:每个事件处理器对应一个或多个感兴趣的事件,如读事件、写事件等。 - **注册事件处理器**:使用`ACE_Reactor::register_handler()`方法将事件处理器注册到反应器。 - **移除事件处理器**:通过`...
每当用户选择或取消选择一个项目时,触发相应的事件处理器。 - 在事件处理器中,遍历当前选中的所有项目,获取它们的值,并进行求和操作。 4. **计算和展示总和**: - 创建一个变量来存储总和,并在每次选择改变...
7. **线程模型**:Otto默认使用主线程来处理事件,这意味着发布在事件总线上的事件会在UI线程中被消费,确保了操作的安全性。但也可以通过自定义注解和处理器来改变这一行为,实现异步处理。 8. **生命周期管理**:...