js#原生#观察者模式案例

在这里插入图片描述

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<style type="text/css">
			.active{
				color: red;
			}
		</style>

	</head>

	<body>
		<div class="container">
			<h3>todo</h3>
			<input type="text">
			<div class="boxs">
				 
			</div>
			
		</div>

	</body>
	<script type="text/javascript">
		class Input{
			constructor(el) {
			    this.observers = []
				el.addEventListener('input',(e)=>{
					this.notifyAll(e.target.value);
				})
			}
			notifyAll(value) {
				this.observers.forEach(item => {
					item.notify(value)
				})
			}
			addObserver(obj) {
				this.observers.push(obj)
			}
		}
		class Observer extends DocumentFragment{
			constructor(t) {
			    super(t);
				this.div = document.createElement('div')
				this.div.className = 'box'
				this.div.innerHTML = t
				document.querySelector('.boxs').append(this.div)
			}
			notify(v) {
				this.div.classList.toggle('active',this.handle(v))
			}
		}
		class DefaultObserver extends Observer{
			constructor(t) {
			    super(t);
				this.t = t;
			}
			handle(v) {
				return v.indexOf(this.t)!=-1;
			}
		}
		class NumberObserver extends Observer{
			constructor(t) {
			    super(t);
				this.t = t;
			}
			handle(v) {
				return /\d/.test(v)
			}
		}
		const ipt = new Input(document.querySelector('input'));
		ipt.addObserver(new DefaultObserver('A'));
		ipt.addObserver(new DefaultObserver('B'));
		ipt.addObserver(new DefaultObserver('C'));
		ipt.addObserver(new NumberObserver('包含数字'));
	</script>
	 


</html>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值