javascript判断图片是否加载完成方法整理

本文介绍并对比了在JavaScript中判断图片加载完成的方法,包括使用onload属性、原生JavaScript方法、jQuery方法,提供了代码示例和优缺点分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有时候我们在前端开发工作中为了获取图片的信息,需要在图片加载完成后才可以正确的获取到图片的大小尺寸,并且执行相应的回调函数使图片产生某种显示效果。本文主要整理了几种常见的javascipt判断图片加载完成时的方法,并通过代码与实际应用相结合进行解释与说明。

 

onload方法

通过向img标签添加onload属性,并填入相应的函数来执行后续的javascipt代码。如下代码例子中img元素默认是不显示的,通过onload判断加载完成后再将图片显示出来。

<img class="pic1" onload="get(this)" src="..." style='display:none' />

<script type="text/javascript">
function get(ts){
	ts.style.display = 'block';  //显示图片
}
</script>

 

优点:可以将javascript代码部分放置于页面的任何部分加载,并且可以用于多数任意图片上。使用比较简单,易理解。

缺点:必须在每个标签上都贴上onlaod属性,在某些无法直接操作HTML代码,或者需要代码精简的情况下不适用

 

javascipt原生方法

选取指定ID的图片,通过onload指定回调方法,在图片加载完成后弹出“图片加载已完成”字样提示。

<img id="pic1" src="..." />

<script language="JavaScript">
    document.getElementById("pic1").onload = function () {
        alert("图片加载已完成");
    }
</script>

 

优点:简单易用,不影响HTML代码。

缺点:只能指定一个元素,javascipt代码必须置于图片元素的下方

 

jquery方法

为每个class为pic1的图片元素绑定事件,通过jquery的load方法,将元素渐现出来。

注意,不要在$(document).ready()里绑定load事件。

<script type="text/javascript">
$(function(){
	$('.pic1').each(function() {
		$(this).load(function(){
			$(this).fadeIn();
		});
    });
})
</script>

 

优点:可以批量绑定元素事件,并且不影响HTML代码内容

缺点:需要jquery库的支持,代码需要放置到需要操作元素的下方。

 

<think>好的,我需要回答用户关于JavaScript图片加载的六种实现方法的问题。首先,我得回忆一下常见的懒加载技术,并确保覆盖不同的方法。用户提到了参考资料的三种引用,其中引用[2]和[3]特别相关,可能涉及scroll事件、offsetTop、getBoundingClientRect、IntersectionObserver等方法。 首先,我应该整理出六种不同的实现方式。常见的包括: 1. 使用scroll事件结合offsetTop 2. 使用scroll事件结合getBoundingClientRect 3. 使用Intersection Observer API 4. 使用data属性配合scroll和resize事件 5. 使用第三方库如lozad.js 6. 结合CSS类名和滚动监听 需要确认这些方法是否都正确,并且是否有足够的参考资料支持。引用[2]提到了scroll事件、offsetTop、getBoundingClientRect和IntersectionObserver,引用[3]展示了用querySelectorAll选择图片。可能第三方库和CSS类名需要另外补充,但用户提供的引用中没有提到,可能需要根据通用知识补充。 接下来,每个方法需要简要说明实现步骤,并给出代码示例。注意使用正确的LaTeX格式,比如行内公式用$...$,独立公式用$$...$$,但懒加载可能涉及较少的数学公式,可能主要需要代码示例。 需要确保回答结构清晰,分点说明,每个方法一个小标题,代码示例用代码块包裹,并参考用户提供的引用适当标注来源。例如,引用[2]提到了IntersectionObserver,所以相关部分需要标注[^2]。 另外,用户要求生成相关问题,可能涉及性能比较、优化方法、兼容性处理等。需要确保问题相关且合理。 需要检查是否有六种方法,如果不够的话可能需要扩展,比如添加使用延迟加载属性loading="lazy",但这个方法属于HTML属性,可能不算JavaScript实现。或者考虑其他事件如MutationObserver来检测DOM变化,动态加载图片。或者使用requestIdleCallback来优化性能。 可能需要调整方法,确保有六种。例如: 1. scroll + offsetTop 2. scroll + getBoundingClientRect 3. scroll节流优化 4. IntersectionObserver 5. 使用data属性并监听滚动和调整大小 6. 结合MutationObserver动态加载 但需要确认这些是否都是不同的实现方式。例如,节流优化可能属于对scroll的优化,不算独立方法。可能需要重新分类。 或者,考虑其他技术,如使用IntersectionObserver的polyfill,或者结合CSS的loading属性,但可能不符合JavaScript的实现。需要确保每个方法都是不同的实现方式。 可能的六种方法: 1. 基于scroll事件和offsetTop属性 2. 基于scroll事件和getBoundingClientRect方法 3. 使用Intersection Observer API 4. 使用data属性,结合scroll和resize事件(可能和前面两种scroll方法有重叠,但可以分开) 5. 结合Mutation Observer动态检测新图片 6. 使用第三方库如lozad.js(虽然用户可能希望原生方法,但作为第六种) 或者,可能将节流优化作为单独的一种方法,但实际上是优化步骤。可能需要调整。 现在,根据引用[2]中的内容,提到了利用scroll事件,包括offsetTop和getBoundingClientRect,以及节流优化,然后IntersectionObserver。引用[3]是代码示例,选择img.lazy-load元素。因此,可能需要将scroll事件的不同计算方式作为两种方法,节流优化作为第三种,IntersectionObserver作为第四种,data属性作为第五种,第三方库作为第六种。 或者,将scroll事件的不同方式作为两种,加上节流优化作为第三种,IntersectionObserver作为第四种,使用loading属性作为第五种(虽然原生HTML),MutationObserver作为第六种。 但用户要求JavaScript实现方法,所以需要确保都是JS层面的。可能需要调整。 最终,确定以下六种方法: 1. 基于HTMLElement.offsetTop的滚动监听 2. 基于Element.getBoundingClientRect()的滚动监听 3. 节流优化的滚动监听 4. 使用Intersection Observer API 5. 结合data属性动态加载 6. 使用MutationObserver检测动态添加的图片 其中,前两种是计算位置的不同方法,第三种是优化,第四种是较新的API,第五种是属性处理,第六种是动态DOM检测。这样可能覆盖六种方式。需要验证每种是否有对应的实现和参考资料。 在引用[2]中,确实提到了offsetTop、getBoundingClientRect、节流优化和IntersectionObserver,所以前四种方法可以基于此。第五种可能涉及将图片URL存储在data属性中,并在需要时替换src,这在引用[3]中的代码示例有使用img.lazy-load,可能使用data-src属性。第六种方法可能需要使用MutationObserver来监听DOM变化,当新图片添加到页面时进行懒加载,这可能是一个独立的实现方式。 现在,开始组织回答: 每个方法需要简要说明原理,给出代码示例,并标注引用。例如,方法一和方法二引用[2],方法四同样引用[2],方法五引用[3]中的代码示例。第六种方法可能没有直接引用,但属于通用知识,所以可能不添加引用标注。 确保代码正确,比如使用addEventListener,替换data-src到src等。 最后,生成相关问题,比如比较不同方法的优缺点,如何处理兼容性,如何优化性能等。 现在,开始撰写回答。</think>### JavaScript 图片加载的6种实现方法教程 #### 1. 基于`scroll`事件与`offsetTop`属性 通过监听页面滚动事件,利用`offsetTop`计算图片位置,判断是否进入可视区域。 ```javascript window.addEventListener('scroll', function() { const images = document.querySelectorAll('img.lazy'); images.forEach(img => { const imgTop = img.offsetTop; const scrollTop = window.pageYOffset; if (imgTop < scrollTop + window.innerHeight) { img.src = img.dataset.src; img.classList.remove('lazy'); } }); }); ``` 原理:当图片的垂直偏移量(`offsetTop`)小于“视口高度 + 滚动距离”时加载图片。 #### 2. 基于`scroll`事件与`getBoundingClientRect()` 使用`getBoundingClientRect()`获取图片相对视口的位置,实现更精确的判断```javascript window.addEventListener('scroll', function() { const images = document.querySelectorAll('img.lazy'); images.forEach(img => { const rect = img.getBoundingClientRect(); if (rect.top < window.innerHeight && rect.bottom >= 0) { img.src = img.dataset.src; img.classList.remove('lazy'); } }); }); ``` 优势:直接获取元素相对于视口的坐标,避免计算误差。 #### 3. 节流优化滚动监听 通过节流函数减少`scroll`事件触发频率,提升性能: ```javascript function throttle(func, delay) { let lastCall = 0; return function(...args) { const now = new Date().getTime(); if (now - lastCall < delay) return; lastCall = now; func.apply(this, args); }; } window.addEventListener('scroll', throttle(function() { // 加载逻辑与上述方法相同 }, 200)); ``` 作用:将高频事件触发间隔控制在200ms内,降低性能消耗。 #### 4. 使用`Intersection Observer` API 现代浏览器原生支持的观察器,无需手动计算位置: ```javascript const observer = new IntersectionObserver((entries) => { entries.forEach(entry => { if (entry.isIntersecting) { const img = entry.target; img.src = img.dataset.src; observer.unobserve(img); } }); }); document.querySelectorAll('img.lazy').forEach(img => { observer.observe(img); }); ``` 优点:代码简洁,性能高效,支持动态阈值配置。 #### 5. 动态替换`data-src`属性 将图片地址存储在`data-src`中,滚动时替换为`src`属性: ```html <img class="lazy-load" data-src="image.jpg" alt="Lazy Image"> ``` ```javascript const lazyLoadImages = document.querySelectorAll("img.lazy-load"); // 引用[3] window.addEventListener('scroll', function() { lazyLoadImages.forEach(img => { if (img.getBoundingClientRect().top < window.innerHeight) { img.src = img.dataset.src; } }); }); ``` #### 6. 使用`MutationObserver`动态检测新增图片 适用于动态加载内容的场景(如AJAX): ```javascript const observer = new MutationObserver((mutations) => { mutations.forEach(mutation => { mutation.addedNodes.forEach(node => { if (node.tagName === 'IMG' && node.classList.contains('lazy')) { // 触发懒加载逻辑 } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值