转载--2010年3月4日dojo学习笔记 dojo.disconnect

1、阻止浏览器默认事件的发生

stopEvent:
var foo = dojo.byId("foo"); //some anchor element
dojo.connect(foo, "onclick", function(evt) {
console.log("anchor clicked");
dojo.stopEvent(evt); //suppress browser navigation and squash any event bubbling
});

 

preventDefault:
var bar = dojo.byId("bar"); //some form element
dojo.connect(bar, "onsubmit", function(evt) {
console.log("form submitted");
evt.preventDefault( ); //suppress browser navigation but allow event bubbling
});

2、事件触发只执行一次

var handle = dojo.connect(
dojo.byId("foo"), //some div element
"onmouseover",
function(evt) {
console.log("Mouse over foo!", evt);
dojo.disconnect(handle);
});

如果dojo.disconnect(handle);放到connect外面,事件一次也不会触发。

3、在循环内部建立事件连接
下面的代码不能达到预期结果,因为匿名函数中的变量i知道函数执行时才会解析,所以console输出的结果都是10.

for (var i=0; i < 10; i++) {
var foo = dojo.byId("foo"+i);
var handle = dojo.connect(foo, "onmouseover", function(evt) {
console.log(i);
dojo.disconnect(handle);
});
}

为了解决这个问题,需要使connect执行时,匿名函数中i的值被解析出来。

for (var i=0; i < 10; i++) {
(function( ) {
var foo = dojo.byId("foo"+i);
var current_i = i; //trap in closure
var handle = dojo.connect(foo, "onmouseover",
function(evt) {
console.log(current_i);
dojo.disconnect(handle);
}
);
})( ); // execute anonymous function immediately
}

4、通过dojo.connectPublisher,可以把没有publish出来的事件,在需要时publish出来

function Foo( ) {
this.greet = function( ) {
console.log("Hi, I'm foo");
}
}
function Bar( ) {
this.greet = function( ) {
console.log("Hi, I'm bar");
}
}
var foo = new Foo;
var bar = new Bar;
var topic = "/dtdg/salutation";
dojo.subscribe(topic, bar, "greet");
dojo.connectPublisher(topic, foo, "greet");
foo.greet( );

 

posted on 2013-04-17 11:18  办幼儿园+国家电网1亿  阅读(451)  评论(0编辑  收藏  举报

返回顶部