当前位置: 首页 > news >正文

如何实现图片的异步加载

1.概述

异步加载:也称为图片的预加载。利用js代码提前加载图片,用户需要时可以直接从本地缓存获取,但是会增加服务器前端的压力。这样做可以提高用户的体验,因为同步加载大图片的时候,图片会一层一层的显示处理,但是经过预加载后,直接显示出整张图片。但是在图片响应时间上优化不是那么明显。

2.基本形式

<script>
        function loadImage(id,url,callback)
        {
            var img = new Image();
            img.src = url;

            // 图片存在缓存中
            if(img.complete){
                callback(id,url);
                return;
            }
            // 图片加载到浏览器的缓存中回调函数
            img.onload = function(){
                callback(id,url);
            }

        }
</script>

3.应用
利用预加载显示3张1980*1080的图片,正常加载的话会慢慢显示出来。而用预加载的话,等一会3张基本同时显示出来。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <div id="img_box">
        <img data-src="http://wozien.com/img/1.jpg" alt="">
        <img data-src="http://wozien.com/img/2.jpg" alt="">
        <img data-src="http://wozien.com/img/3.jpg" alt="">
    </div>

    <script>
        function loadImage(obj,url,callback)
        {
            var img = new Image();
            img.src = url;

            // 判断图片是否在缓存中
            if(img.complete){
                callback.call(img,obj);
                return;
            }

            // 图片加载到浏览器的缓存中回调函数
            img.onload = function(){
                callback.call(img,obj);
            }
        }

        function showImage(obj){
            obj.src = this.src;
        }

        var imgs = document.querySelectorAll('img');
        for(var i = 0;i<imgs.length;i++)
        {
            var url = imgs[i].dataset.src;
            loadImage(imgs[i],url,showImage);
        }
    </script>
</body>
</html>

相关文章:

  • AMD和CMD的区别
  • 使用Cesium.js加载3D模型
  • js中for in与for of之间的差异
  • Cesium实现三维可视化一般步骤
  • Vue2.0 探索之路——生命周期和钩子函数的一些理解
  • vuejs实践todolist列表
  • vue中的watch监听事件机制
  • CommonJS、AMD、CMD的区别
  • npm局部安装和全局安装文件的区别
  • querySelector操作dom的用法
  • webpack打包文件出错
  • npm中的--save-dev与--save的区别
  • vue-router路由导航钩子
  • javascript本地上传并解析excel文件
  • echarts柱状图的x轴文字纵向显示
  • .pyc 想到的一些问题
  • [Vue CLI 3] 配置解析之 css.extract
  • 230. Kth Smallest Element in a BST
  • 30秒的PHP代码片段(1)数组 - Array
  • CentOS从零开始部署Nodejs项目
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • java B2B2C 源码多租户电子商城系统-Kafka基本使用介绍
  • JavaScript 是如何工作的:WebRTC 和对等网络的机制!
  • JavaScript-Array类型
  • leetcode-27. Remove Element
  • Less 日常用法
  • linux学习笔记
  • open-falcon 开发笔记(一):从零开始搭建虚拟服务器和监测环境
  • React as a UI Runtime(五、列表)
  • 大数据与云计算学习:数据分析(二)
  • 第13期 DApp 榜单 :来,吃我这波安利
  • 跨域
  • 猫头鹰的深夜翻译:Java 2D Graphics, 简单的仿射变换
  • 普通函数和构造函数的区别
  • 使用Gradle第一次构建Java程序
  • 【云吞铺子】性能抖动剖析(二)
  • #pragma once
  • #我与Java虚拟机的故事#连载06:收获颇多的经典之作
  • (done) NLP “bag-of-words“ 方法 (带有二元分类和多元分类两个例子)词袋模型、BoW
  • (强烈推荐)移动端音视频从零到上手(下)
  • (三)Honghu Cloud云架构一定时调度平台
  • (实战)静默dbca安装创建数据库 --参数说明+举例
  • (一)kafka实战——kafka源码编译启动
  • (一)VirtualBox安装增强功能
  • (转)memcache、redis缓存
  • (转)机器学习的数学基础(1)--Dirichlet分布
  • **登录+JWT+异常处理+拦截器+ThreadLocal-开发思想与代码实现**
  • ... fatal error LINK1120:1个无法解析的外部命令 的解决办法
  • .equals()到底是什么意思?
  • .net core 依赖注入的基本用发
  • .NET/C# 将一个命令行参数字符串转换为命令行参数数组 args
  • .NET国产化改造探索(一)、VMware安装银河麒麟
  • .net流程开发平台的一些难点(1)
  • @Builder用法
  • @modelattribute注解用postman测试怎么传参_接口测试之问题挖掘