图片的javascript延时加载

本文介绍了一种使用JavaScript实现的图片懒加载技术,该技术通过延迟加载不在可视区域内的图片来提高网页性能。当用户滚动页面时,仅加载进入可视区域的图片。

在页面很长(超过3屏)且图片又很多时,默认情况下浏览器会加载所有图片,有可能导致第二屏的图片显示出来了,但第一屏的图片还在加载,这种情况最适合用"javascript延时加载"来改善用户体验.

原理:

1.根据图片元素距页面顶部的距离,判断图片自身在第几屏

2.所有图片元素的src值先不设置,改而用其它自定义属性,比如src写成lazy_src(这样浏览器就不会主动加载图片)

3.根据1的判断,如果轮到自己登场了(即到顶部的距离变化了,比如用户拉动滚动条了),则将lazy_src值赋值为src,这样浏览器就开始加载了.

代码:(收集于网上)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
< html xmlns = "http://www.w3.org/1999/xhtml" >
< head >
     < title >js延时加载</ title >
     < script type = "text/javascript" >
         lazyLoad = (function () {
             var map_element = {};
             var element_obj = [];
             var download_count = 0;
             var last_offset = -1;
             var doc_body;
             var doc_element;
             var lazy_load_tag;
             
             function initVar(tags) {
                 doc_body = document.body;
                 //判断是否为IE的"怪异模式"
                 doc_element = document.compatMode == 'BackCompat' ? doc_body : document.documentElement;
                 lazy_load_tag = tags || ["img", "iframe"];
             };
 
             function initElementMap() {
                 //var all_element = [];
                 //从所有相关元素中找出需要延时加载的元素 
                 for (var i = 0, len = lazy_load_tag.length; i < len ; i++) {
                     var el = document .getElementsByTagName(lazy_load_tag[i]);
                     for (var j = 0 , len2 = el .length; j < len2; j++) {
                         if (typeof (el[j]) == "object" && el[j].getAttribute("lazy_src")) {
                             element_obj.push(el[j]);
                         }
                     }
                 }
                 
 
                 for (var i = 0 , len = element_obj .length; i < len; i++) {
                     var o_img = element_obj [i];
                     var t_index = getAbsoluteTop (o_img); //得到图片相对document的距上距离 
                     if (map_element[t_index]) {
                         map_element[t_index].push(i);
                     } else {
                         //按距上距离保存一个队列 
                         var t_array = [];
                         t_array[0] = i;
                         map_element[t_index] = t_array;
                         download_count++; //需要延时加载的图片数量 
                     }
                 }
 
             };
 
             function initDownloadListen() {
                 if (!download_count) return;
                 var offset = (window.MessageEvent && !document.getBoxObjectFor) ? doc_body.scrollTop : doc_element.scrollTop;
                 //可视化区域的高=offtset+document的高 
                 var visio_offset = offset + doc_element.clientHeight;
                 if (last_offset == visio_offset) {
                     setTimeout(initDownloadListen, 200);//每隔0.2秒检测一次,这玩意儿感觉有些耗资源的
                     return;
                 }
                 last_offset = visio_offset ;
                 var visio_height = doc_element .clientHeight;
                 var img_show_height = visio_height + offset;
                 for (var key in map_element) {
                     if (img_show_height > key) {
                         var t_o = map_element[key];
                         var img_vl = t_o.length;
                         for (var l = 0; l < img_vl ; l++) {
                             element_obj[t_o[l]] .src = element_obj [t_o[l]].getAttribute("lazy_src");
                         }
                         delete map_element[key];
                         download_count--;
                     }
                 }
                 setTimeout(initDownloadListen, 200);
             };
 
             function getAbsoluteTop(element) {
                 if (arguments.length != 1 || element == null) {
                     return null;
                 }
                 var offsetTop = element .offsetTop;
                 while ( element = element.offsetParent) {
                     offsetTop += element.offsetTop;
                 }
                 return offsetTop;
             }
 
             function init(tags) {
                 initVar(tags);
                 initElementMap();
                 initDownloadListen();
             };
 
             return {
                 init: init
             }
         })();
     </script>
     < style type = "text/css" >
         img{height:800px}
     </ style >
</ head >
< body >
     < div >
     </ div >
     < script type = "text/javascript" >
         lazyLoad.init();
     </ script >
</ body >
</ html >

注意事项:图片最好都用样式定义高度,否则图片的高度默认为0,就上面的例子来讲,所有img标签都挤在一起,全部在第一屏,导致程序认为它们都应该加载,就看不到效果了. 

另外这种方式有一个致命的缺点:如果浏览器禁用了javascript,将会失效!所以使用前请先考虑清楚,或者在页面上加一些提示(类似:“您的浏览器不支持javascript,页面显示可能不正常”之类)


欧姆龙FINS(工厂集成网络系统)协议是专为该公司自动化设备间数据交互而设计的网络通信标准。该协议构建于TCP/IP基础之上,允许用户借助常规网络接口执行远程监控、程序编写及信息传输任务。本文档所附的“欧ronFins.zip”压缩包提供了基于C与C++语言开发的FINS协议实现代码库,旨在协助开发人员便捷地建立与欧姆龙可编程逻辑控制器的通信连接。 FINS协议的消息框架由指令头部、地址字段、操作代码及数据区段构成。指令头部用于声明消息类别与长度信息;地址字段明确目标设备所处的网络位置与节点标识;操作代码定义了具体的通信行为,例如数据读取、写入或控制器指令执行;数据区段则承载实际交互的信息内容。 在采用C或C++语言实施FINS协议时,需重点关注以下技术环节: 1. **网络参数设置**:建立与欧姆龙可编程逻辑控制器的通信前,必须获取控制器的网络地址、子网划分参数及路由网关地址,这些配置信息通常记载于设备技术手册或系统设置界面。 2. **通信链路建立**:通过套接字编程技术创建TCP连接至控制器。该过程涉及初始化套接字实例、绑定本地通信端口,并向控制器网络地址发起连接请求。 3. **协议报文构建**:依据操作代码与目标功能构造符合规范的FINS协议数据单元。例如执行输入寄存器读取操作时,需准确配置对应的操作代码与存储器地址参数。 4. **数据格式转换**:协议通信过程中需进行二进制数据的编码与解码处理,包括将控制器的位状态信息或数值参数转换为字节序列进行传输,并在接收端执行逆向解析。 5. **异常状况处理**:完善应对通信过程中可能出现的各类异常情况,包括连接建立失败、响应超时及错误状态码返回等问题的处理机制。 6. **数据传输管理**:运用数据发送与接收函数完成信息交换。需注意FINS协议可能涉及数据包的分割传输与重组机制,因单个协议报文可能被拆分为多个TCP数据段进行传送。 7. **响应信息解析**:接收到控制器返回的数据后,需对FINS响应报文进行结构化解析,以确认操作执行状态并提取有效返回数据。 在代码资源包中,通常包含以下组成部分:展示连接建立与数据读写操作的示范程序;实现协议报文构建、传输接收及解析功能的源代码文件;说明库函数调用方式与接口规范的指导文档;用于验证功能完整性的测试案例。开发人员可通过研究这些材料掌握如何将FINS协议集成至实际项目中,从而实现与欧姆龙可编程逻辑控制器的高效可靠通信。在工程实践中,还需综合考虑网络环境稳定性、通信速率优化及故障恢复机制等要素,以确保整个控制系统的持续可靠运行。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值