`

dojo的事件处理框架

阅读更多

引用说明:原文来自于http://coralsea.bokee.com/viewdiary.12065264.html,为了方便本人阅读,文本格式略有调整。

本文档目标:
1、简单介绍Dojo的事件处理框架——Event System。
2、这样的事件处理框架对于页面内的组件解耦是有帮助的。


Dojo Event System
Dojo的Event System以类似于AOP的advice机制的风格,来为DOM事件和任何的方法提供统一的事件处理框架,而不会给使用大多数简单的DOM事件机制的开发者带来额外的学习和开发负担。
Dojo关注的事件不仅仅是DOM事件,它把任何的JS方法调用都看作可以侦听的事件。
参见:The Dojo Event System

 

事件绑定示例:


1.简单的示例代码:

场景:当按钮点击事件发生时,调用handleOnClick方法。

var buttonNode = document.getElementById(“button”);
function handleOnClick(evt)
{
   ……
}
dojo.event.connect(buttonNode,”onclick”,”handleOnClick”);

这样当按钮的点击事件时间发生时,handleOnClick方法也就会被调用。

 

2. 普通的事件绑定代码:
场景:如果按钮的点击事件发生,则调用object的handle方法。
以前我们这么写:

var buttonNode= document.getElementById("button");
buttonNode.onclick = function(evt){
  object.handler(evt);
};
现在Dojo将其简化成:

var buttonNode = document.getElementById("button");
dojo.event.connect(buttonNode, "onclick", object, "handler");


3. 多个事件的绑定
var buttonNode = document.getElementById("button");
dojo.event.connect(buttonNode, "onclick", object1, "handler1");
dojo.event.connect(buttonNode, "onclick", object2, "handler2");
这样当按钮点击事件发生时,就会先调用object1的handle1方法,再调用object2的handle2方法。


4. 解除绑定
可以使用Dojo的disconnect方法,调用参数与connect一致,即可解除之前的绑定操作。


5. 关键字绑定
为了防止不经意间对事件的多处绑定,造成连锁调用。Dojo提供关键字链绑定,比如可以只绑定一次: 
dojo.event.kwConnect({
  srcObj: exampleObj,
  srcFunc: "foo",
  targetObj: exampleObj,
  targetFunc: "bar",
  once: true
});
同样,对应也提供了一个kwDisconnect()方法来进行关键字绑定的解除。


6. 延迟执行和循环执行的绑定
Dojo同样可以通过关键字绑定来使方法延迟执行或者循环执行。


7. 高级应用:Seeking Advice
除了提供上述的后次序绑定,还可以提供before的绑定,这有点类似于AOP的逻辑。
提供around advice方式,解决场景:

如果待绑定的源方法和目的方法的签名不一样;
如果想改变代码的行为,但是又不改写代码。

around advice可以包装任何方法,然后操纵方法的输入和输出。
代码示例如下:

function foo(arg1, arg2){
  // …
}function aroundFoo(invocation){
  if(invocation.args.length < 2){
    // note that it's a real array, not a pseudo-arr
    invocation.args.push("default for arg2");
  }
  var result = invocation.proceed();
  // we could change the result here
  return result;
}dojo.event.connect("around", "foo", "aroundFoo");
这样,当foo方法只传入一个参数的时候,aroundFoo方法会为其添加第二个参数,然后继续foo方法的执行。


8. 通过Topic机制来注册和订阅事件
示例代码如下: 
var exampleObj = {
  counter: 0,
  foo: function(){
    alert("foo");
    this.counter++;
  },
  bar: function(){
    alert("bar");
    this.counter++;
  }
};
// previously we used this connect syntax
//
// dojo.event.connect(exampleObj, "foo", exampleObj, "bar");
//// which we now replace with:
// set up our publisher
dojo.event.topic.registerPublisher("/example", exampleObj, "foo");// and at some point later, register our listener
dojo.event.topic.subscribe("/example", exampleObj, "bar");


工作的基本原理:
通过在JavaScript中动态改变方法名称,使用apply方法来实现对方法的顺序绑定。
基本原理代码:

var global = this;
function naiveConnect(funcName1, funcName2){
  global["__prefix"+funcName1] = funcName1;
  global[funcName1] = function(){
    global["__prefix"+funcName1].apply(global, arguments);
    global[funcName2].apply(global, arguments);
  }
}

 

 

分享到:
评论

相关推荐

    dojo事件处理框架

    Dojo的Event System以类似于AOP的advice机制的风格,来为DOM事件和任何的方法提供统一的事件处理框架,而不会给使用大多数简单的DOM事件机制的开发者带来额外的学习和开发负担。

    arcgis for js离线部署及dojo框架的入门

    对arcgis for js API的离线部署进行简单配置描述,涉及AMD规范的定义与讲解,其中也提到了安装postgress数据库的基本步骤,对想发布地图服务和处理数据有所帮助

    struts结合dojo

    Dojotoolkit是当前比较流行的JavaScript框架,dojo主要提供了以下功能:JavaScript Web组件(例如Tree,Grid,Button,Menu等),事件处理框架,Ajax异步调用等功能,非常好用。 Dojo现在主要有两个版本: 0.4.3 ...

    《实战Dojo工具包》教程 pdf

    《实战Dojo工具包》教程 pdf,Dojo是一个品质远远超出“原型建造”的Ajax框架库,本实用教程就是为Dojo而写。她将向我们介绍Dojo开发环境的创建、旅行路线编辑器、DOM和HTML的效果、处理DOM、使用Dojo创建AJAX远程...

    轻松AJAX by dojo

    Dojo中包含有很多JavaScript编写的子package,负责处理当你在建造一个JavaScript应用时通常 必须要自己来编写的基础(infrastructure)工作。它封装了跨浏览器的令人烦恼的代码,这样你就不 必担心它们会...

    JavaScript事件代理和委托详解

    这里介绍一下javascript delegate的用法和原理,以及Dojo,jQuery等框架中delegate的接口。 JavaScript事件代理 事件代理在JS世界中一个非常有用也很有趣的功能。当我们需要对很多元素添加事件的时候,可以通过将...

    浅析JavaScript的事件代理和委托

    在javasript中delegate这个词经常出现...当我们需要对很多元素添加事件的时候,可以通过将事件添加到它们的父节点而将事件委托给父节点来触发处理函数。这主要得益于浏览器的事件冒泡机制,后面会详细介绍。下面我们具

    Web GIS从基础到开发实践 基于ArcGIS API for JavaScript

    3.2.3可移动的框架小部件 3.2.4测试 3.3集中控制的小部件微架构 3.3.1可集中控制的框架小部件 3.3.2小部件容器 3.3.3测试 3.3.4订阅/发布模式的事件处理机制 3.4使用菜单组织功能 3.4.1菜单容器小部件 3.4.2菜单项...

    WebGIS从基础到开发实践代码(基于ArcGIS API for JavaScript)

    3.3.4订阅/发布模式的事件处理机制 3.4使用菜单组织功能 3.4.1菜单容器小部件 3.4.2菜单项小部件 3.4.3菜单小部件 3.4.4测试 第4章地图与图层 4.1图层操作 4.1.1图层类及其之间的继承关系 4.1.2切片地图图层 4.1.3...

    java开源包1

    该框架封装了线程处理、异步读/写等方面。 Java多线程程序死锁检查 JCarder JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 ...

    java开源包11

    该框架封装了线程处理、异步读/写等方面。 Java多线程程序死锁检查 JCarder JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 ...

    java开源包2

    该框架封装了线程处理、异步读/写等方面。 Java多线程程序死锁检查 JCarder JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 ...

    java开源包3

    该框架封装了线程处理、异步读/写等方面。 Java多线程程序死锁检查 JCarder JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 ...

    java开源包6

    该框架封装了线程处理、异步读/写等方面。 Java多线程程序死锁检查 JCarder JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 ...

    java开源包5

    该框架封装了线程处理、异步读/写等方面。 Java多线程程序死锁检查 JCarder JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 ...

    java开源包10

    该框架封装了线程处理、异步读/写等方面。 Java多线程程序死锁检查 JCarder JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 ...

    java开源包4

    该框架封装了线程处理、异步读/写等方面。 Java多线程程序死锁检查 JCarder JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 ...

    java开源包8

    该框架封装了线程处理、异步读/写等方面。 Java多线程程序死锁检查 JCarder JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 ...

    java开源包7

    该框架封装了线程处理、异步读/写等方面。 Java多线程程序死锁检查 JCarder JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 ...

Global site tag (gtag.js) - Google Analytics