JS为DOM添加事件

在原生的环境下,为DOM添加事件处理函数有多种方法:

<input type="button" name="btn" value="点击…" id="btn" onclick="btnClick" />

或者使用以下方法:

    <input type="button" name="btn" value="点击…" id="btn" />
<script type="text/javascript">
function btnClick() {
alert("我被点击了");
}
document.getElementById("btn").onclick = btnClick;</script>

以上这两种方法存在明显的弊端:每一个事件只能指定一个事件处理函数,另外,如果要移除一个事件处理函数,似乎只能使用:

document.getElementById("btn").onclick = null;

或者

document.getElementById("btn").onclick = "";

这种方式极不利于模块化编程。W3C DOM Level2 标准有了新的事件模型,新的事件模型允许为事件添加多个处理方法,并加入了事件冒泡机制。

使用新的事件模型来添加事件处理方法:

    <input type="button" name="btn" value="点击…" id="btn" />
<script type="text/javascript">
function btnClick() {
alert("我被点击了");
}
document.getElementById("btn").addEventListener("click", btnClick);
</script>

移除一个事件处理方法:

document.getElementById("btn").removeEventListener("click", btnClick);

dojo事件处理

dojo使用connect方法为DOM添加事件处理函数。

    <script type="text/javascript">
function btnClick() {
alert("我被点击了");
}
var btn = dojo.byId("btn");
dojo.connect(btn, "onclick", btnClick);
</script>

dojo.connect方法的官方解释:dojo.connect is the core event handling and delegation method in Dojo. It allows one function to "listen in" on the execution of any other, triggering the second whenever the first is called. Many listeners may be attached to a function, and source functions may be either regular function calls or DOM events.

翻译过来大概是:dojo.connect 是dojo中事件处理和委托方法的核心。它允许一个方法去“监听”另一个方法的执行,当被监听方法被调用的时候触发监听方法。一个方法可以附加很多监听者,这个源方法可以是常规的方法或DOM事件。

这么说来,connect还可以监听别的方法的执行,下面我们来做一个测试:

    <input type="button" name="btn" value="点击…" id="btn" />
<script type="text/javascript">
function sayHello() {
alert("Hello ");
} function sayWorld() {
alert("world~");
} dojo.addOnLoad(function () {
var btn = dojo.byId("btn");
btn.addEventListener("click", sayHello);
dojo.connect("sayHello", sayWorld);
});
</script>

这段代码的执行效果是当按钮被点击之后,先弹出一个Hello字符串,当把对话框关掉以后,会弹出另外一个world对话框。

可能不是每个人都喜欢这种处理方式,但这样以来,代码会更易于阅读。

如果需要移除一个事件,则需要调用dojo.disconnect方法,这个方法需要一个dojo.connect方法的返回值作为参数:

        var handle = dojo.connect(btn, "onclick", btnClick);
dojo.disconnect(handle);

订阅和发布

这是dojo很值得关注的一个功能,它使得各个dojo组件可以方便的交互。这个功能使用起来很方便:

    <input type="text" name="txtMessage" value="" id="txtMessage" />
<input type="button" name="btn" value="发布…" id="btnPublish" />
<script type="text/javascript">
dojo.addOnLoad(function () {
//订阅MesagePublish主题
dojo.subscribe("MessagePublish", function (msg) {
alert(msg);
}); var btnPublish = dojo.byId("btnPublish");
dojo.connect(btnPublish, "onclick", function () {
dojo.publish("MessagePublish", dojo.byId("txtMessage").value);
});
});
</script>

以上代码的运行效果如图:

如要取消一个订阅,需要使用dojo.unsubscribe方法,这个方法需要一个由dojo.subscribe返回的句柄,其处理方式和dojo.connect、dojo.disconnect 的方式一样。

如果认为此文对您有帮助,别忘了支持一下哦!

声明:本博客原创文字只代表本人工作中在某一时间内总结的观点或结论,与本人所在单位没有直接利益关系。转载时请在文章页面明显位置给出原文链接。

Dojo入门:dojo中的事件处理的更多相关文章

  1. Dojo入门:初识Dojo

      Dojo的全称是Dojo Toolkit,始创于2004年,是当前各种蓬勃发展的JS工具包中的佼佼者.Dojo 为富互联网应用程序(RIA) 的开发提供了完整的端到端的解决方案,包括核心的 Jav ...

  2. 手把手教你Dojo入门

    如果仅仅是为了练习Dojo,或者进行测试,可以参考下面的步骤.下面的文件均是在Windows下测试 需要的工具 1 Tomcat服务器:下载地址 选择适合自己的机器型号,即可 2 Dojo的工具包:下 ...

  3. dojo入门

    1.引入dojo.js dojo的发行包里有4个子目录,要引入的文件是名叫"dojo"的子目录里的dojo.js. 假设你是这样的目录结构: project | +--dojo-l ...

  4. Dojo入门:DOM操作

      作为一款功能齐全的js工具包,dojo提供了统一的DOM操作方法. dojo.byId dojo.byId 函数使您可以通过 id 属性选择一个 DOM 节点.该函数是标准 document.ge ...

  5. 第38课 Qt中的事件处理(上)

    1. GUI程序原理回顾 (1)图形界面应用程序的消息处理模型 (2)思考:操作系统发送的消息如何转变为Qt信号 2. Qt中的事件处理 (1)Qt平台将系统产生的消息转换为Qt事件 ①Qt事件是一个 ...

  6. [转]理解JavaScript中的事件处理

    什么是事件? 事件(Event)是JavaScript应用跳动的心脏 ,也是把所有东西粘在一起的胶水.当我们与浏览器中 Web 页面进行某些类型的交互时,事件就发生了.事件可能是用户在某些内容上的点击 ...

  7. 理解JavaScript中的事件处理

    什么是事件? 事件(Event)是JavaScript应用跳动的心脏 ,也是把所有东西粘在一起的胶水.当我们与浏览器中 Web 页面进行某些类型的交互时,事件就发生了.事件可能是用户在某些内容上的点击 ...

  8. dojo/dom dojo/domConstruct dojo/query

    dom.byId require(["dojo/dom", "dojo/domReady!"], function(dom) { var one = dom.b ...

  9. js中关于事件处理函数名后面是否带括号的问题

    今天总结一个关于事件处理程序的小细节.首先回顾一下事件处理的一些概念. JS中的事件处理(事件绑定)就是让某种或某些事件触发某些活动.有两种常见的形式,分别是DOM Level 0 和DOM Leve ...

  10. 理解JavaScript中的事件处理 阻止冒泡event.stopPropagation();

    原文地址:http://www.cnblogs.com/binyong/articles/1750263.html 这篇文章对于了解Javascript的事件处理机制非常好,将它全文转载于此,以备不时 ...

随机推荐

  1. libcyusb

    https://github.com/hmaarrfk/libcyusb/blob/master/include/cyusb.h

  2. CentOS系统下使用docker安装pinpoint

    准备:安装docker与docker-compose docker安装参考:https://www.cnblogs.com/zhi-leaf/p/10561501.html docker-compos ...

  3. Spring NamespaceHandlerResolver xml的标签加载的扩展 和 ApplicationContext

    NamespaceHandlerResolver public NamespaceHandler resolver(String namespaceUri); DefaultNamespaceHand ...

  4. 如何理解Hibernate的延迟加载机制?

    延迟加载就是并不是在读取的时候就把数据加载进来,而是等到使用时再加载.Hibernate使用了虚拟代理机制实现延迟加载.返回给用户的并不是实体本身,而是实体对象的代理.代理对象在用户调用getter方 ...

  5. Vue中如何使用axios请求跨域数据

    1.axios不支持jsonp,因为axios的作者觉得jsonp不太友好,推荐用CORS方式更为干净: 2.在使用axios发送请求时,服务器端设置 res.header("Access- ...

  6. python学习_新闻联播文字版爬虫(V 1.0.1版)

    更新记录: 1.新增了headers头的随机获取: 2.新增了logging模块添加日志信息(学习用): #!/usr/bin/env python # -*- coding: utf-8 -*- ' ...

  7. k8s-insight测试

    eureka apiVersion: v1 kind: Pod metadata: name: eureka labels: ccb: eureka spec: containers: - name: ...

  8. 悲观锁,乐观锁以及MVCC

    在上文中,我们探讨了MySQL不同存储引擎中的各类锁,在这篇文章中我们将要讨论的是MySQL是如何实现并发控制的.并发问题有三种,分别为: 读-读,不存在任何问题 读-写,有隔离性问题,可能遇到脏读( ...

  9. mysql 报错从 新安装

    卸载从新安装,综合运用 https://www.jb51.net/article/146050.htm https://www.jb51.net/article/90275.htm https://w ...

  10. cp:复制文件和目录

    cp 命令,主要用来复制文件和目录,同时借助某些选项,还可以实现复制整个目录,以及比对两文件的新旧而予以升级等功能. cp 命令的基本格式如下:cp [选项] 源文件 目标目录/文件 选项: -a:相 ...