读Ext消息机制有感之简单仿写(一)

Ext实现太过复杂,有太多自己的封装,个人感觉给组件绑定事件监听,就是window.addEventListener 或者是window.attachListener。这这两个方法。现阶段自身采用通过读Ext源码来学习js的应用,下面的一些封装是对之前学习到的内容进行一次实战奋斗

<%@ page contentType="text/html; charset=UTF-8" %>
<html>
<head>
<script type="text/javascript">
Ext = {version: '1.1'};
Ext.cacheEl = {};
/**
	@param element: 原生element元素 或者是String类型的id
	如果是new function创建的对象或者{}类型的,都是返回ture
*/
Ext.isObject = function(obj) {
	return Object.prototype.toString.call(obj) == '[object Object]'? true : false;
}
/**
	@param source 源
	@param target 目标,这里的数据拷贝到source的prototype上
	target可以是fucntion 创建的对象,也可以是{}类型
*/
Ext.apply = function(source,target) {
	var _proto = source.prototype;
	if(Ext.isObject(target)) {
		for(var el in target) {
			_proto[el] = target[el]; 
		}
	}
	return source;
}
Ext.Element = function(element) {   
	element = typeof element == 'string'? document.getElementById(element) : element;
	if(!element) {
		return null;
	}
	var idEl = element.id;
	if(idEl && !Ext.cacheEl[idEl]) {
		Ext.Element.toAddCache(element);
	}
	this.dom = element;
	this.id = idEl;
}
Ext.Manager = function() {
	//定义其他方法供返回对象里面的方法调用
	return {
		addLister: function(event,actor,scope) {
			var dom = Ext.cacheEl[scope.id].el; //这里其实可以直接用scope.dom或者由上边个参数进来,为了使用Ext.cacheEl,所以这么写
			if(window.addEventListener) {
				dom.addEventListener(event, actor);
			}else{
				if(window.attachEvent) {
					dom.attachEvent('on' + event, actor);
				}
			}
		}
	};
}();
Ext.apply(Ext.Element,{
	addListener: function(event,fn) {  //addListener('click',function(){})
		var scope = this;
		var idEl = scope.id;
		var eventEl = Ext.cacheEl[idEl].events;
		eventEl[event] = [fn];
		function actor(event) {
			//这里Ext可以将event封装成自身的消息对象
			fn.apply(this);        //执行相应函数,在这里可以定义一些参数,供使用者在编写相应方法时候调用
		}
		Ext.Manager.addLister(event,actor,scope);
	}
});

/**
	@param element: 原生element元素
*/
Ext.Element.toAddCache = function(element) {
	var obj = {
		el: element,
		data: [],
		events: []
	}
	Ext.cacheEl[element.id] = obj;
}
/**
	定义几个将原生dom封装成Ext自定义的Element元素
*/
Ext.get = Ext.find = function(element) {
	element = new Ext.Element(element);
	return element;
}
window.onload = function() {
	Ext.get('logonbox').addListener('click', function(){
		alert('响应点击事件');
	
	});
}
</script>
</head>
<body>
<div id='logonbox' >点击按钮</div>
</body>
</html>




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值