//判断数据类型的方法(对typeof的增强,9种常用类型的判断,返回小写字符串)
function Type(obj) {
var arr = ['null', 'undefined', 'number', 'string', 'boolean', 'nan', 'array', 'object', 'function'];
if (obj === null) {
return 'null';
}
if (obj !== obj) {
return 'nan';
}
if (typeof Array.isArray === 'function') {
if (Array.isArray(obj)) { //浏览器支持则使用isArray()方法
return 'array';
}
} else { //否则使用toString方法
if (Object.prototype.toString.call(obj) === '[object Array]') {
return 'array';
}
}
return (typeof obj).toLowerCase();
}
//生成32位唯一字符串(大小写字母数字组合)
function soleString32() {
var str = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
var timestamp = +new Date() + Math.floor(Math.random() * 10);
var resultStr = '';
for (var i = 0; i < 19; i++) {
resultStr += str.charAt(Math.floor(Math.random() * str.length));
}
resultStr += timestamp;
resultStr = resultStr.split('');
resultStr.sort(function (a, b) {
return Math.random() - 0.5;
});
resultStr = resultStr.join('');
return resultStr;
}
//自定义事件的实现(发布订阅模式)
var customEvent = {
json: {},
on: function (evName, fn) {
if (Type(this.json[evName]) != 'object') {
this.json[evName] = {};
}
if (Type(fn) == 'function') {
fn.id = soleString32();
this.json[evName][fn.id] = fn;
}
return this;
},
emit: function (evName) {
var evFnArr = this.json[evName];
var params = Array.prototype.slice.call(arguments, 1);
if (Type(evFnArr) == 'object') {
for (var attr in this.json[evName]) {
if (Type(this.json[evName][attr]) == 'function') {
this.json[evName][attr].apply(this, params);
}
}
}
return this;
},
remove: function (evName, fn) {
var evFnArr = this.json[evName];
if (Type(evName) == 'string' && Type(evFnArr) == 'object') {
if (Type(fn) == 'function') {
if (fn.id) {
delete this.json[evName][fn.id];
} else {
for (var attr in this.json[evName]) {
if (this.json[evName][attr] + '' === fn + '') {
delete this.json[evName][attr];
break;
}
}
}
} else {
delete this.json[evName];
}
}
return this;
}
};
订阅一个事件
customEvent.on('eventName',function(res){
console.log('自定义事件参数',res);
});
发布事件
customEvent.emit('eventName','发送参数')