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

相关文章

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Makefile简明使用教程

文章目录 规则makefile文件的基本语法:加在命令前的特殊符号:.PHONY伪目标: Makefilev1 直观写法v2 加上中间过程v3 伪目标v4 变量 make 选项-f-n-C Make 是一种流行的构建工具,常用于将源代码转换成可执行文件或者其他形式的输出文件(如库文件、文档等)。Make 可以自动化地执行编译、链接等一系列操作。 规则 makefile文件

禁止平板,iPad长按弹出默认菜单事件

通过监控按下抬起时间差来禁止弹出事件,把以下代码写在要禁止的页面的页面加载事件里面即可     var date;document.addEventListener('touchstart', event => {date = new Date().getTime();});document.addEventListener('touchend', event => {if (new

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

计算机毕业设计 大学志愿填报系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点赞 👍 收藏 ⭐评论 📝 🍅 文末获取源码联系 👇🏻 精彩专栏推荐订阅 👇🏻 不然下次找不到哟~Java毕业设计项目~热门选题推荐《1000套》 目录 1.技术选型 2.开发工具 3.功能

SWAP作物生长模型安装教程、数据制备、敏感性分析、气候变化影响、R模型敏感性分析与贝叶斯优化、Fortran源代码分析、气候数据降尺度与变化影响分析

查看原文>>>全流程SWAP农业模型数据制备、敏感性分析及气候变化影响实践技术应用 SWAP模型是由荷兰瓦赫宁根大学开发的先进农作物模型,它综合考虑了土壤-水分-大气以及植被间的相互作用;是一种描述作物生长过程的一种机理性作物生长模型。它不但运用Richard方程,使其能够精确的模拟土壤中水分的运动,而且耦合了WOFOST作物模型使作物的生长描述更为科学。 本文让更多的科研人员和农业工作者

论文翻译:arxiv-2024 Benchmark Data Contamination of Large Language Models: A Survey

Benchmark Data Contamination of Large Language Models: A Survey https://arxiv.org/abs/2406.04244 大规模语言模型的基准数据污染:一项综述 文章目录 大规模语言模型的基准数据污染:一项综述摘要1 引言 摘要 大规模语言模型(LLMs),如GPT-4、Claude-3和Gemini的快

沁恒CH32在MounRiver Studio上环境配置以及使用详细教程

目录 1.  RISC-V简介 2.  CPU架构现状 3.  MounRiver Studio软件下载 4.  MounRiver Studio软件安装 5.  MounRiver Studio软件介绍 6.  创建工程 7.  编译代码 1.  RISC-V简介         RISC就是精简指令集计算机(Reduced Instruction SetCom

前端技术(七)——less 教程

一、less简介 1. less是什么? less是一种动态样式语言,属于css预处理器的范畴,它扩展了CSS语言,增加了变量、Mixin、函数等特性,使CSS 更易维护和扩展LESS 既可以在 客户端 上运行 ,也可以借助Node.js在服务端运行。 less的中文官网:https://lesscss.cn/ 2. less编译工具 koala 官网 http://koala-app.

【Shiro】Shiro 的学习教程(三)之 SpringBoot 集成 Shiro

目录 1、环境准备2、引入 Shiro3、实现认证、退出3.1、使用死数据实现3.2、引入数据库,添加注册功能后端代码前端代码 3.3、MD5、Salt 的认证流程 4.、实现授权4.1、基于角色授权4.2、基于资源授权 5、引入缓存5.1、EhCache 实现缓存5.2、集成 Redis 实现 Shiro 缓存 1、环境准备 新建一个 SpringBoot 工程,引入依赖: