js观察者


前言

大家在开发过程中,经常会遇到需要页面图片懒加载来优化,常规需要监听页面滚动来计算,此方式及其麻烦,下面则是相对比较简单的方式。

提示:以下是本篇文章正文内容,下面案例可供参考

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<meta name="viewport" content="width=device-width, initial-scale=1">
	<title></title>
	
</head>
<body>
<div id="box">
	<img src="./img/noface.jpg" data-src='./img/1.avif'>
	<img src="./img/noface.jpg" data-src='./img/2.avif'>
	<img src="./img/noface.jpg" data-src='./img/3.avif'>
	<img src="./img/noface.jpg" data-src='./img/4.avif'>
	<img src="./img/noface.jpg" data-src='./img/5.avif'>
	<img src="./img/noface.jpg" data-src='./img/1.avif'>
	<img src="./img/noface.jpg" data-src='./img/2.avif'>
	<img src="./img/noface.jpg" data-src='./img/3.avif'>
	<img src="./img/noface.jpg" data-src='./img/4.avif'>
	<img src="./img/noface.jpg" data-src='./img/5.avif'>
	<img src="./img/noface.jpg" data-src='./img/1.avif'>
	<img src="./img/noface.jpg" data-src='./img/2.avif'>
	<img src="./img/noface.jpg" data-src='./img/3.avif'>
	<img src="./img/noface.jpg" data-src='./img/4.avif'>
	<img src="./img/noface.jpg" data-src='./img/5.avif'>
	<img src="./img/noface.jpg" data-src='./img/1.avif'>
	<img src="./img/noface.jpg" data-src='./img/2.avif'>
	<img src="./img/noface.jpg" data-src='./img/3.avif'>
	<img src="./img/noface.jpg" data-src='./img/4.avif'>
	<img src="./img/noface.jpg" data-src='./img/5.avif'>
	<img src="./img/noface.jpg" data-src='./img/1.avif'>
	<img src="./img/noface.jpg" data-src='./img/2.avif'>
	<img src="./img/noface.jpg" data-src='./img/3.avif'>
	<img src="./img/noface.jpg" data-src='./img/4.avif'>
	<img src="./img/noface.jpg" data-src='./img/5.avif'>
</div>
<style type="text/css">
		*{margin: 0;padding: 0}
	/*	img {
			width: 150px;
			height: 150px;
		}*/

		div	 {
			margin-left: 50%;
			height: 300px;
			overflow: auto;
			width: 300px;
		}
	</style>
<script type="text/javascript">
	window.addEventListener('load', () => {
		let box = document.getElementById('box')
	const observe = new IntersectionObserver((nums) => {
			nums.forEach(item => {
				console.log(item.isIntersecting)
				// item.isIntersecting 为true代表已交叉
				if(item.isIntersecting) {
					item.target.src = item.target.dataset.src
					// 取消监听
					observe.unobserve(item.target)
				}
			})
	},{
		root:box,//默认窗口
		rootMargin:'0px',//向外扩展
		threshold:1 //交叉比例 0-1
	})

	const imgs = document.querySelectorAll('img[data-src]')
	imgs.forEach(item => {
		// 监听每个img
		observe.observe(item)
	})
	});
	

</script>
</body>
</html>

使用上述观察者模式可以轻松处理图片懒加载的问题

  • 12
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
观察者模式(Observer Pattern)是一种常用的设计模式,它用于对象间的一对多依赖关系的处理,当一个对象的状态发生改变时,所有依赖它的对象都会得到通知并自动更新。 在JavaScript中,观察者模式通常用于DOM事件监听、异步回调、数据绑定等场景。下面是一个简单的实例,使用观察者模式实现一个发布-订阅模式的事件处理器。 ```javascript // 事件处理器 class EventHandler { constructor() { this.handlers = {}; } // 订阅事件 subscribe(eventName, handler) { if (!this.handlers[eventName]) { this.handlers[eventName] = []; } this.handlers[eventName].push(handler); } // 取消订阅 unsubscribe(eventName, handler) { if (!this.handlers[eventName]) { return; } const index = this.handlers[eventName].indexOf(handler); if (index !== -1) { this.handlers[eventName].splice(index, 1); } } // 发布事件 publish(eventName, ...args) { if (!this.handlers[eventName]) { return; } this.handlers[eventName].forEach(handler => handler(...args)); } } // 使用示例 const eventHandler = new EventHandler(); // 订阅事件 eventHandler.subscribe('click', () => console.log('click event fired')); eventHandler.subscribe('change', (value) => console.log(`value changed to ${value}`)); // 发布事件 eventHandler.publish('click'); // 输出: "click event fired" eventHandler.publish('change', 10); // 输出: "value changed to 10" // 取消订阅 const handler = () => console.log('test'); eventHandler.subscribe('test', handler); eventHandler.unsubscribe('test', handler); ``` 在上面的代码中,我们创建了一个 EventHandler 类,它包含了三个方法:subscribe、unsubscribe 和 publish。它们分别用于订阅事件、取消订阅事件和发布事件。在使用时,我们可以通过调用 subscribe 方法来订阅事件,通过 publish 方法来发布事件,通过 unsubscribe 方法来取消订阅事件。当发布一个事件时,所有订阅该事件的处理器都会被调用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值