微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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方法,可以一次删除所有事件监听。

原文地址:https://www.jb51.cc/dojo/290909.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐