easyui中的那些事件

js中本来就存在很多的事件,像鼠标点击,键盘按下弹出,文档图片加载完毕等。但一直有一个问题就是easyui中的像 onOpen,onClose,onloadSuccess等是怎么实现的?

两个猜想: 1.通过延迟对象(回调函数)的方式。

2.自定义事件

回调函数的方式自然是不用说的:

如:

function MyDialog(){
   this.open = function(callback){
      console.log("打开弹出框");
      callback();
   }
   this.onOpen=function(){
      console.log("打开弹出框后执行");
   };
}
var temp = new MyDialog();
temp.open(temp.onOpen);

结果:

 

由此可见,在MyDialog类中,onOpen函数定义在Open函数的后面也是没有问题的。

function open(){
   console.log("打开弹出框");
   onOpen();
}
function onOpen(){
   console.log("打开弹出框后执行");
};
open();

但原本以为这样写会报错的,没想到也是可以的。那么我们是不是可以这样想,在js执行前,它自己已经是心中有数,都有那些函数,都是什么,哪个有错。

这样做是可以的,但是我想easyui的作者肯定不可能写的这么简单,至少是用jquery中的延迟对象吧。

 

那么重点来了,用自定义事件是怎么搞的呢?关于自定义事件人家是这样说的:

 

事件并不是只能被绑定到DOM元素上,我们可以将其绑定到自定义的对象上,从而开发出类似于Java的事件驱动框架,又称为发布/订阅模式。

发布者向某个信道发布一条消息,订阅者绑定这个信道,当有消息发布至信道时就会接收到一个通知。发布者和订阅者是完全解耦的,甚至彼此可以并不知晓对方的存在。

jquery的自定义事件:因为原生的js自定义事件牵扯到检测浏览器等比较麻烦。

$(function(){
   $("p").bind("myOnOpen", function (event,msg) {   //bind已经被去掉了,请用On代替
      console.log(msg);
   });
});

function Myopen(){
   console.log("打开弹出框");
   $("p").trigger("myOnOpen",["打开弹出框后执行"]);
};
<button οnclick="Myopen()">触发</button> 点解按钮时得到结果

以下几种写法是有问题的:

$("p").on("myOnOpen", function (event,msg) {  //此时页面没有加载完毕,它都没找到p元素
   console.log(msg);
})
function Myopen(){
   console.log("打开弹出框");
   $("p").trigger("myOnOpen",["打开弹出框后执行"]);
};
Myopen();   //把他们整体写在$(function(){});的里面就可以了。

*执行就是执行,定义就是定义,跟写在那个位置是没有关系的。

$(function(){
   function Myopen(){
      console.log("打开弹出框");
      $("p").trigger("myOnOpen",["打开弹出框后执行"]);
   };
   Myopen();
   $("p").on("myOnOpen", function (event,msg) {
      console.log(msg);
   });
})    //不行

当然,自定义事件也可以绑定到普通对象上面:

function myDlg(){
   var that = this;
   (function(){
      $(that).on("MyOnOpen",onOpen);
   })();
   function onOpen(e,msg){
      console.log("打开弹出框后执行"+msg);
   };
   this.open = function(){
      console.log("打开自定义弹出框");
      $(that).trigger("MyOnOpen",["test"]);
   }
};
var MyDialog = new myDlg();
MyDialog.open();

转载于:https://my.oschina.net/u/3163071/blog/824853

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值