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( );