自定义事件(简单版)
let Event = {
on(event, cb) {
if (!this.handles) {
this.handles = {}
}
if (!this.handles[event]) {
this.handles[event] = []
}
this.handles[event].push(cb)
},
emit(event) {
if (this.handles[arguments[0]]) {
for (let i = 0; i < this.handles[arguments[0]].length; i++) {
this.handles[arguments[0]][i](...[].slice.call(arguments, 1))
}
}
},
off(event) {
if (this.handles[event]) {
delete this.handles[event]
}
}
}
Event.on('log', function (param1, param2) {
console.log('log', param1, param2)
})
Event.emit('log', 1, 2)
Event.off('log')
Event.emit('log')
自定义事件(复杂版)
let Event = {
on() {
let event = arguments[0].split(' ')
for (let i = 0; i < event.length; i++) {
let _event = event[i].match(/([^\.]+)\.*([^\.]*)/),
eventType = _event[1],
eventMark = _event[2]
if (!this.handles) {
this.handles = {}
}
if (!this.handles[eventType]) {
this.handles[eventType] = {}
}
if (!this.handles[eventType][eventMark]) {
this.handles[eventType][eventMark] = []
}
this.handles[eventType][eventMark].push(arguments[1])
}
},
emit() {
let _event = arguments[0].match(/([^\.]+)\.*([^\.]*)/),
eventType = _event[1],
eventMark = _event[2]
if (this.handles) {
let eventTypeObj = this.handles[eventType]
if (eventTypeObj) {
if (eventMark) {
_cb(eventMark, eventTypeObj, arguments)
} else {
for (let eventMark in eventTypeObj) {
_cb(eventMark, eventTypeObj, arguments)
}
}
}
}
function _cb(eventMark, eventTypeObj, _arguments) {
if (eventTypeObj[eventMark]) {
for (let i = 0; i < eventTypeObj[eventMark].length; i++) {
eventTypeObj[eventMark][i](...[].slice.call(_arguments, 1))
}
}
}
},
off() {
let _event = arguments[0].match(/([^\.]+)\.*([^\.]*)/),
eventType = _event[1],
eventMark = _event[2]
if (eventMark) {
delete this.handles[eventType][eventMark]
} else {
delete this.handles[eventType]
}
}
}
Event.on('log', function (param1, param2) {
console.log('log', param1, param2)
})
Event.on('log.a log.b', function () {
console.log('log.a/b')
})
Event.on('log.c', function () {
console.log('log.c')
})
Event.emit('log', 1, 2)
Event.off('log.a')
Event.emit('log.a')
Event.emit('log.c')
扩展(原生js实现jquery的on和off事件)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1, user-scalable=no">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
<title>demo</title>
<style>
* {
margin: 0;
padding: 0;
}
body,
html {
width: 100%;
height: 100%;
}
</style>
</head>
<body>
<button class="a">a 按下</button>
<button class="b">b 按下</button>
<button class="c">c 按下</button>
</body>
<script>
let Event = {
on() {
var el = [],
event = [],
callback = null;
for (var i = 0; i < arguments.length; i++) {
switch (this.isType(arguments[i])) {
case 'window':
case 'html':
el.push(arguments[i]);
break;
case 'string':
event = arguments[i].split(' ');
break;
case 'function':
callback = arguments[i];
break;
}
}
for (var i = 0; i < el.length; i++) {
for (var j = 0; j < event.length; j++) {
var _event = event[j].match(/([^\.]+)\.*([^\.]*)/),
eventType = _event[1],
eventMark = _event[2];
if (!eventMark) {
eventMark = ('' + Math.random()).replace('.', '');
}
if (!this.event) {
this.event = {};
}
this.event[eventMark] = callback;
el[i].addEventListener(eventType, this.event[eventMark]);
}
}
},
off() {
var el = [],
event = [];
for (var i = 0; i < arguments.length; i++) {
switch (this.isType(arguments[i])) {
case 'window':
case 'html':
el.push(arguments[i]);
break;
case 'string':
event = arguments[i].split(' ');
break;
}
}
for (var i = 0; i < el.length; i++) {
for (var j = 0; j < event.length; j++) {
var _event = event[j].match(/([^\.]+)\.*([^\.]*)/),
eventType = _event[1],
eventMark = _event[2];
el[i].removeEventListener(eventType, this.event[eventMark]);
if (!eventMark) {
for (var key in this.event) {
el[i].removeEventListener(eventType, this.event[key]);
}
}
}
}
},
isType(obj, type) {
var _type = Object.prototype.toString.call(obj).toLowerCase();
if (_type.indexOf('html') + 1) {
_type = 'html';
} else {
_type = _type.replace('[object ', '').replace(']', '');
}
return type ? _type == type : _type;
}
}
Event.on(document.querySelector('.a'), 'mousedown', function () {
console.log(1)
})
Event.on(document.querySelector('.b'), document.querySelector('.c'), 'mousedown.a mouseup.b', function () {
console.log(2)
})
Event.off(document.querySelector('.c'), 'mousedown.a')
</script>
</html>
谈谈JS的观察者模式(自定义事件)