Dojo 学习--event(1) dojo/on与Nodelist on方法

这节了解怎么通过dojo在DOM元素上来绑定事件。

原生DOM Event

DOM元素的原始事件处理函数包括addEventListener ,attachEvent,DOM0(有待学习)
attachEvent是IE的方法,FF及其他使用addEventListener 。
使用Dojo的DOM event,可以屏蔽各种native API之间的不同,避免内存泄露,以单一直接的方式处理event。Dojo的event API 是dojo/on

官网Dojo event例子

官网关于本节内容的地址:
http://dojotoolkit.org/documentation/tutorials/1.10/events/index.html

例子详情:

html页面有两个DOM元素

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

以下代码实现:当点击button的时候,div颜色变为blue。当鼠标移到div上时变红。鼠标移开时div由黑变为白色

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,"red"); });
        on(myDiv,mouse.leave,""); });
});

例子中引入了dojo/mouse。因为并不是所有原生浏览器都支持mouseentermouseleave,引入dojo/mouse可以忽略浏览器来使进行鼠标的各项操作。

dojo/on的使用形式形式

on(element,event name,handler).
对所有的window,document,node,form,mouse,and keyboard 事件都有效.

另外一种dojo事件调用方式:dojo.connect
dojo.connect(element,event,handler)

注意:上面两种方式不同点,dojo.connect的event需要带on,写成“onclick”的形式,dojo/on是要写成“click”不带on。

Dojo也提供了事件消除处理,on(…)的返回值是一个object,这个object有一个remove方法调用之后可remove事件监听。事件的一次调用,常使用以下的代码形式:

var handle = on(myButton,function(evt){
    // Remove this event using the handle
    handle.remove();

    // Do other stuff here that you only want to happen one time
    alert("This alert will only happen one time.");
});

BTW,dojo/on一个很便捷的方法:on.once,实现以上相同功能on.oncedojo/on的参数是一样的,on.once执行一次后,自动去除handler。

dojo/on只能在DOM元素的上下文中运行handler,有另外方法hitch (属于dojo/_base/lang 模块) 能够指定事件运行的上下文。这对于对象化的方法来说是很有用的。

require(["dojo/on","dojo/_base/lang",function(on,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,myObject.onClick); // This will alert "myObject" rather than "myScopedButton2" on(myScopedButton2,lang.hitch(myObject,"onClick")); });

Nodelist 事件

NodeList事件是将事件绑定到多个node节点上,使用的是属于dojo/query模块的on方法,这个on方法dojo/on方法类似。但是Nodelist模式下的on方式是没有第一个参数,Nodelist的node充当了第一个参数。

这个on方法是属于dojo/query。所以不用加载dojo/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",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做进一步操作,它返回的是事件处理函数的返回对象数组,这个事件处理返回对象是可以remove的。同样的,这个数组也包括一个最高级别的remove方法,可以一次删除所有事件监听。

相关文章

我有一个网格,可以根据更大的树结构编辑小块数据.为了更容易...
我即将开始开发一款教育性的视频游戏.我已经决定以一种我可以...
我正在使用带有Grails2.3.9的Dojo1.9.DojoNumberTextBox小部...
1.引言鉴于个人需求的转变,本系列将记录自学arcgisapiforja...
我正在阅读使用dojo’sdeclare进行类创建的语法.描述令人困惑...
我的团队由更多的java人员和JavaScript经验丰富组成.我知道这...