Dojo1.11官方教程文档翻译(3.3)Dojo 事件

2024-03-11 04:48

本文主要是介绍Dojo1.11官方教程文档翻译(3.3)Dojo 事件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

3.3 Dojo事件

原文地址:https://dojotoolkit.org/documentation/tutorials/1.10/events/index.html
GitBook地址:https://www.gitbook.com/book/limeng1900/dojo1-11-tutorials-translation-in-chinese/details
转载请注明出处:http://blog.csdn.net/taijiedi13/ – 碎梦道


本教程中,我们将探索dojo/on以及Dojo如何更容易地连接DOM事件。我们也将探索Dojo的publish/subscribe框架:dojo/topic

入门

你的许多JavaScript代码都用来为事件做准备:包括生成和相应新事件。就是说构建响应式、交互式web应用的关键就是创建高效的事件连接。事件连接可以让你的应用响应用户交互和等待动作的发生。Dojo中DOM事件的主力是dojo/on,下面一起来看如何使用这个模块。

DOM事件

你会问自己“DOM不是已经提供了一个机制来注册事件处理程序么?”答案是yes,但并不是所有的浏览器都遵循 W3C DOM 规范。在各种主流浏览器里主要有三种方式来注册事件处理器:addEventListenerattachEvent和 DOM 0。除此之外,还有两个不同的事件对象实现和至少一种 fires registered listeners in random order.aspx) and leaks memory.aspx)的浏览器引擎。Dojo改善了你使用DOM事件的方式,用一个名叫dojo/on的单一、直白的事件API将各种原生API标准化并阻止内存泄漏。
假设我们有以下标记:

<button id="myButton">Click me!</button>
<div id="myDiv">Hover over me!</div>

再想象一下,你想要在点击按钮的时候让div变成蓝色,鼠标经过时变为红色,完成悬停后变回白色。dojo/on很容易实现:

require(["dojo/on", "dojo/dom", "dojo/dom-style", "dojo/mouse", "dojo/domReady!"],function(on, dom, domStyle, mouse) {var myButton = dom.byId("myButton"),myDiv = dom.byId("myDiv");on(myButton, "click", function(evt){domStyle.set(myDiv, "backgroundColor", "blue");});on(myDiv, mouse.enter, function(evt){domStyle.set(myDiv, "backgroundColor", "red");});on(myDiv, mouse.leave, function(evt){domStyle.set(myDiv, "backgroundColor", "");});
});

注意也require了dojo/mouse。不是所有的浏览器原生支持mouseentermouseleave事件,所以用dojo/mouse来添加支持。你可以自己编写像dojo/mouse一样的模块来支持其他自定义事件类型。
这个例子阐述了常见模式: on(element,event name,handler)。或者换个说话就是某个元素上的某个事件连接某个处理器。该模式适用于全部的window、document、node、 form、mouse和keyboard事件。
注意和旧的dojo.connectAPI不一样,使用dojo/on模块时,事件名称的“on”前缀必须省略。
on方法不仅仅规范了事件注册的API,还规范了事件处理器的工作方式:

  • 事件处理器总是按注册的顺序调用。
  • 它们调用时都将一个事件对象作为第一个参数,
  • 事件对象总是规范的包含常见W3C事件对象属性、类似target属性、一个stopPropagation方法和一个preventDefault方法。
    就像DOM API,Dojo提供一个方法来移除一个事件处理器:_handle_.removeon的返回值是一个带有remove方法的简单对象,调用该方法是将移除事件监听。例如,如果你想要一个一次性的事件,你就可以这么做:
var handle = on(myButton, "click", function(evt){// Remove this event using the handlehandle.remove();// Do other stuff here that you only want to happen one timealert("This alert will only happen one time.");
});

顺便提下,dojo/on还有一个简便的方法:on.once。它接收和on一样的参数,但是会在它触发一次之后移除处理程序。
最后要说明的是:默认情况下,on将会在将节点传递为第一参数的上下文中运行事件处理器。例外是当它用来事件委托时,稍后就会讨论。

无论如何,你可以使用lang.hitch(来自dojo/_base/lang模块)来指定运行处理器的上下文。当使用对象方法时,hitch非常有用:

require(["dojo/on", "dojo/dom", "dojo/_base/lang", "dojo/domReady!"],function(on, dom, lang) {var myScopedButton1 = dom.byId("myScopedButton1"),myScopedButton2 = dom.byId("myScopedButton2"),myObject = {id: "myObject",onClick: function(evt){alert("The scope of this handler is " + this.id);}};// This will alert "myScopedButton1"on(myScopedButton1, "click", myObject.onClick);// This will alert "myObject" rather than "myScopedButton2"on(myScopedButton2, "click", lang.hitch(myObject, "onClick"));});

View Demo

不像它的前任dojo.connecton不接受处理器作用域和方法参数。你需要为第三个参数使用lang.hitch,如果你希望保持执行语境。

NodeList事件

前面的教程提到过,NodeList提供一种多节点注册事件的方式:on方法。这个方法遵循dojo/on相同的模式,但没有第一个参数(由于NodeList的节点是你将要连接的对象)。

on方法包含在dojo/query里,所以你用NodeList.on时不需要专门requiredojo/on
让我们看一个更高级的例子:

<button id="button1" class="clickMe">Click me</button>
<button id="button2" class="clickMeAlso">Click me also</button>
<button id="button3" class="clickMe">Click me too</button>
<button id="button4" class="clickMeAlso">Please click me</button>
<script>
require(["dojo/query", "dojo/_base/lang", "dojo/domReady!"],function(query, lang) {var myObject = {id: "myObject",onClick: function(evt){alert("The scope of this handler is " + this.id);}};query(".clickMe").on("click", myObject.onClick);query(".clickMeAlso").on("click", lang.hitch(myObject, "onClick"));});
</script>

记住不同于NodeList.connectNodeList.on方法并不返回NodeList,反之,它返回一个稍后可removeon处理器的数组。 这个数组也包含一个便利的最高阶remove方法,可以一次移除全部的监听器。

View Demo

事件委托

上面讨论过,NodeList的on方法可以很容易的把相同事件的同一处理器连接到多个DOM节点上。dojo/on也可以通过更高效的事件委托来实现这个。
事件委托背后的理念不是对每一个独立兴趣节点绑定一个事件监听,而是给一个节点在更高层面上单独附加一个监听器,它会检查捕获的事件的目标,看这些目标是否是从真实的兴趣节点冒泡来的,如果是则执行处理器逻辑。
以前这个可以(现在仍可以)通过dojox/NodeList/delegate来扩展NodeList。在1.10中就可以用dojo/on模块,语法是on(parent enement, "selector:event name ", handler)
为了更好的说明,来看另一个基于和之前相同premise的例子:

<div id="parentDiv"><button id="button1" class="clickMe">Click me</button><button id="button2" class="clickMe">Click me also</button><button id="button3" class="clickMe">Click me too</button><button id="button4" class="clickMe">Please click me</button>
</div>
<script>
require(["dojo/on", "dojo/dom", "dojo/query", "dojo/domReady!"],function(on, dom){var myObject = {id: "myObject",onClick: function(evt){alert("The scope of this handler is " + this.id);}};var div = dom.byId("parentDiv");on(div, ".clickMe:click", myObject.onClick);});
</script>

请注意,我们也需要require dojo/query模块,虽然并不直接使用它。因为dojo/on需要dojo/query提供的选择器引擎来实现事件委托的选择器匹配。为了减少封装和避免不经常使用的特性困扰开发者,它没有被dojo/on自动引入。

View Demo

在运行上面的例子时,注意this仍然引用实际的兴趣节点,不是parentDiv节点。这是使用on进行事件委托的重要区别:this不再引用第一个参数传入的节点,而是选择器匹配的节点。这会非常有用。

对象方法

dojo/on的前任——dojo.connect曾经也可实现 function-to-function的事件连接。这个功能已经划分到了名叫dojo/aspect的资源。你很快会在后面的dojo/aspect的教程中看到。

Publish/Subscribe

目前为止的所有例子都是用已存在的对象作为一个事件生成器,当发生一些事情时注册的这个对象可以了解到。不过,如果你没有一个节点的处理器或者不知道是否创建了一个对象时应该怎么办?这里引入Dojo的发布和订阅(pub/sub)框架,它在1.10版本的dojo/topic模块里。你可以用pub/sub为“topic”(这是一个有趣的事件名称,可以有多种资源,表示为一个字符串)注册一个处理器(订阅)。
想象一下在我们正在开发的一个应用中,我们想要确保按钮会在用户的动作下弹出信息,不打算编写例行程序来弹出不止一次,但是也不想要一个在按钮上注册这个小程序的包装对象。这里可以使用pub/sub :

<button id="alertButton">Alert the user</button>
<button id="createAlert">Create another alert button</button><script>
require(["dojo/on", "dojo/topic", "dojo/dom-construct", "dojo/dom", "dojo/domReady!"],function(on, topic, domConstruct, dom) {var alertButton = dom.byId("alertButton"),createAlert = dom.byId("createAlert");on(alertButton, "click", function() {// When this button is clicked,// publish to the "alertUser" topictopic.publish("alertUser", "I am alerting you.");});on(createAlert, "click", function(evt){// Create another buttonvar anotherButton = domConstruct.create("button", {innerHTML: "Another alert button"}, createAlert, "after");// When the other button is clicked,// publish to the "alertUser" topicon(anotherButton, "click", function(evt){topic.publish("alertUser", "I am also alerting you.");});});// Register the alerting routine with the "alertUser" topic.topic.subscribe("alertUser", function(text){alert(text);});});
</script>

View Demo

这种模式的一个优势在于我们不需要创建任何DOM对象就可以在单元测试中测试我们的弹出程序:这个程序和事件生成器不挂钩。
如果你想要停止获取一个topic的通知,topic.subscribe返回一个带有remove方法的对象,这个方法可以用来移除单个处理器(就像on)。

注意和dojo.publish不同,topic.publish不希望通过数组来传递发布参数。例如,topic.publish("someTopic", "foo", "bar")等同于dojo.publish("someTopic", ["foo", "bar"])

小结

Dojo事件虽然用起来很简单,但是非常强大。on方法可以将不同浏览器间DOM事件的差异规范化。Dojo的pub/sub框架、dojo/topic向开发者提供了将事件处理器从事件生成器分离出来的方法。花点时间来熟悉这些工具吧,它们在创建web应用时非常有用。

这篇关于Dojo1.11官方教程文档翻译(3.3)Dojo 事件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

python连接本地SQL server详细图文教程

《python连接本地SQLserver详细图文教程》在数据分析领域,经常需要从数据库中获取数据进行分析和处理,下面:本文主要介绍python连接本地SQLserver的相关资料,文中通过代码... 目录一.设置本地账号1.新建用户2.开启双重验证3,开启TCP/IP本地服务二js.python连接实例1.

Python 安装和配置flask, flask_cors的图文教程

《Python安装和配置flask,flask_cors的图文教程》:本文主要介绍Python安装和配置flask,flask_cors的图文教程,本文通过图文并茂的形式给大家介绍的非常详细,... 目录一.python安装:二,配置环境变量,三:检查Python安装和环境变量,四:安装flask和flas

Spring Security基于数据库的ABAC属性权限模型实战开发教程

《SpringSecurity基于数据库的ABAC属性权限模型实战开发教程》:本文主要介绍SpringSecurity基于数据库的ABAC属性权限模型实战开发教程,本文给大家介绍的非常详细,对大... 目录1. 前言2. 权限决策依据RBACABAC综合对比3. 数据库表结构说明4. 实战开始5. MyBA

Java利用docx4j+Freemarker生成word文档

《Java利用docx4j+Freemarker生成word文档》这篇文章主要为大家详细介绍了Java如何利用docx4j+Freemarker生成word文档,文中的示例代码讲解详细,感兴趣的小伙伴... 目录技术方案maven依赖创建模板文件实现代码技术方案Java 1.8 + docx4j + Fr

Ubuntu中远程连接Mysql数据库的详细图文教程

《Ubuntu中远程连接Mysql数据库的详细图文教程》Ubuntu是一个以桌面应用为主的Linux发行版操作系统,这篇文章主要为大家详细介绍了Ubuntu中远程连接Mysql数据库的详细图文教程,有... 目录1、版本2、检查有没有mysql2.1 查询是否安装了Mysql包2.2 查看Mysql版本2.

Elasticsearch 在 Java 中的使用教程

《Elasticsearch在Java中的使用教程》Elasticsearch是一个分布式搜索和分析引擎,基于ApacheLucene构建,能够实现实时数据的存储、搜索、和分析,它广泛应用于全文... 目录1. Elasticsearch 简介2. 环境准备2.1 安装 Elasticsearch2.2 J

使用C#代码在PDF文档中添加、删除和替换图片

《使用C#代码在PDF文档中添加、删除和替换图片》在当今数字化文档处理场景中,动态操作PDF文档中的图像已成为企业级应用开发的核心需求之一,本文将介绍如何在.NET平台使用C#代码在PDF文档中添加、... 目录引言用C#添加图片到PDF文档用C#删除PDF文档中的图片用C#替换PDF文档中的图片引言在当

详解C#如何提取PDF文档中的图片

《详解C#如何提取PDF文档中的图片》提取图片可以将这些图像资源进行单独保存,方便后续在不同的项目中使用,下面我们就来看看如何使用C#通过代码从PDF文档中提取图片吧... 当 PDF 文件中包含有价值的图片,如艺术画作、设计素材、报告图表等,提取图片可以将这些图像资源进行单独保存,方便后续在不同的项目中使

Linux系统中卸载与安装JDK的详细教程

《Linux系统中卸载与安装JDK的详细教程》本文详细介绍了如何在Linux系统中通过Xshell和Xftp工具连接与传输文件,然后进行JDK的安装与卸载,安装步骤包括连接Linux、传输JDK安装包... 目录1、卸载1.1 linux删除自带的JDK1.2 Linux上卸载自己安装的JDK2、安装2.1

C#如何动态创建Label,及动态label事件

《C#如何动态创建Label,及动态label事件》:本文主要介绍C#如何动态创建Label,及动态label事件,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#如何动态创建Label,及动态label事件第一点:switch中的生成我们的label事件接着,