react lazyload
思路:
DOM加载时,<img> 标签里,添加data-src路径 = src 路径, src路径 = 本地默认图片路径,
DOM加载完成后,监听页面可视区域,有data-src时,就将src路径替换成data-src路径,进行图片加载。
/**
* 页面
*/
import LazyLoad from '../libs/LazyLoad';
imglazyload(htmlStr) {
let imgList = [];
const src = [];
const dataSrc = [];
const imgSrc = [];
let newHtmlStr = htmlStr;
imgList = newHtmlStr.match(/<img [^>]* src=['"]([^'"]+)[^>]*>/gi, function (match, capture) {
});
/*
匹配图片(g表示匹配所有结果i表示区分大小写)
const imgReg = /<img.*>/gi;
匹配src属性
*/
const srcReg = / src=['"]?([^'"]*)['"]?/gi;
/* 匹配data-src属性
var dataSrcReg = / data-src=['"]?([^'"]*)['"]?/gi; */
if (imgList) {
for (let i = 0; i < imgList.length; i++) {
src[i] = imgList[i].match(srcReg);
/* dataSrc[i] = imgList[i].match(dataSrcReg); */
/* dataSrc赋值src,且不随src的改变而改变 */
dataSrc[i] = src[i].slice(0);
/* 替换src属性 */
dataSrc[i][0] = dataSrc[i][0].replace(/src/gi, 'data-src');
/* 组装 src data-src */
imgSrc[i] = '<img class="news_img_back"' + dataSrc[i][0];
/* 获取图片地址 */
newHtmlStr = newHtmlStr.replace(/<img [^>]* src=['"]?([^'"]*)['"]?/gi, imgSrc[i]);
}
//newHtmlStr = newHtmlStr.replace(/(<img[^>]+)src=(['"]?([^'"]*)['"]?)/gi, "$1 data-src= $2"); //功能与绿色字体部分相同
/* 进程的最后执行,即在return之后执行 */
setTimeout(LazyLoad, 0);
} return newHtmlStr;
} render(){
<div dangerouslySetInnerHTML={{ __html: this.imglazyload(news.content)}} />
}
/* lazyload.js
* expects a list of:
* `<img src="blank.gif" data-src="my_image.png" width="600" height="400" class="lazy">`
*/ const $q = function (q, res) {
if (document.querySelectorAll) {
res = document.querySelectorAll(q);
} else {
const d = document, a = d.styleSheets[0] || d.createStyleSheet();
a.addRule(q, 'f:b');
for (let l = d.all, b = 0, c = [], f = l.length; b < f; b++) {
l[b].currentStyle.f && c.push(l[b]);
}
a.removeRule(0);
res = c;
}
return res;
}, addEventListener = function (evt, fn) {
window.addEventListener ? window.addEventListener(evt, fn, false)
: (window.attachEvent) ? this.attachEvent('on' + evt, fn)
: window['on' + evt] = fn;
},
_has = function (obj, key) {
return Object.prototype.hasOwnProperty.call(obj, key);
}; /* src 与data-src 替换 */
function loadImage(el, fn) {
const img = new Image(),
/* getAttribute() 方法返回指定属性名的属性值 */
src = el.getAttribute('data-src');
/* img.onload: img元素加载完后执行 */
img.onload = function () {
if (!! el.parent) {
el.parent.replaceChild(img, el);
} else {
el.src = src;
}
fn ? fn() : null;
};
img.src = src;
} function elementInViewport(el) {
/* 获取元素各边距离页面各边的距离 */
const rect = el.getBoundingClientRect();
return (
rect.top >= 0
&& rect.left >= 0
&& rect.top <= (window.innerHeight || document.documentElement.clientHeight)
);
} export default function () {
const images = [],
query = $q('[data-src]'),
processScroll = function () {
for (let i = 0; i < images.length; i++) {
if (elementInViewport(images[i])) {
loadImage(images[i], function () {
images.splice(i, i);
});
}
}
};
/* Array.prototype.slice.call is not callable under our lovely IE8 */
for (let i = 0; i < query.length; i++) {
images.push(query[i]);
}
processScroll();
addEventListener('scroll', processScroll);
}
react lazyload的更多相关文章
- react 使用 lazyload 懒加载图片
文档地址 index.html <script> (function(w, d) { var b = d.getElementsByTagName("body")[0] ...
- react初识
如下是在研究中记录的笔记: 1,作用:局部的更新dom结构;虚拟dom保证性能2,和mvc不同,mvc是对于技术上的分离(分类),而react是组件上的分离,每个视图模块分离,复用,以视图模块为单位3 ...
- React 16 加载性能优化指南
关于 React 应用加载的优化,其实网上类似的文章已经有太多太多了,随便一搜就是一堆,已经成为了一个老生常谈的问题. 但随着 React 16 和 Webpack 4.0 的发布,很多过去的优化手段 ...
- 使用react全家桶制作博客后台管理系统 网站PWA升级 移动端常见问题处理 循序渐进学.Net Core Web Api开发系列【4】:前端访问WebApi [Abp 源码分析]四、模块配置 [Abp 源码分析]三、依赖注入
使用react全家桶制作博客后台管理系统 前面的话 笔者在做一个完整的博客上线项目,包括前台.后台.后端接口和服务器配置.本文将详细介绍使用react全家桶制作的博客后台管理系统 概述 该项目是基 ...
- 使用react+redux+react-redux+react-router+axios+scss技术栈从0到1开发一个applist应用
先看效果图 github地址 github仓库 在线访问 初始化项目 #创建项目 create-react-app applist #如果没有安装create-react-app的话,先安装 npm ...
- react 首屏性能优化
首屏优化点:1.加载包(bundle.js)文件的大小,越小,首屏渲染速度越快 (按需加载) 2.优先渲染用户直观看到的页面部分(懒加载) 技术点:react-loadable . react-laz ...
- React全家桶构建一款Web音乐App实战(六):排行榜及歌曲本地持久化
上一节使用Redux管理歌曲相关数据,实现核心播放功能,播放功能是本项目最复杂的一个功能,涉及各个组件之间的数据交互,播放逻辑控制.这一节继续开发排行榜列表和排行榜详情,以及把播放歌曲和播放歌曲列表的 ...
- 看完你也想编写自己的 react 插件
副标题----为什么我要写这个 react 插件 图片懒加载是项目中常用的功能,然而现有 react 懒加载组件库,用着都不是很爽了 ?.概括一下有如下几点: 没有只针对 image 懒加载组件.多数 ...
- 如何实现 React 模块动态导入
如何实现 React 模块动态导入 React 模块动态导入 代码分割 webpack & code splitting https://reactjs.org/docs/code-split ...
随机推荐
- 简述抽象和封装,对你学习Java有一些作用
作为一个Java 初学者,对Java的理解可能有些片面,甚至有些错误的理解,对于观看此处的您,希望您选择性观看!!! 天知道我为什么选择学习编程,我不爱编程,但是我既然学习了,还是会努力学习的,在此分 ...
- js常见报错之Unexpected token in JSON at position
源头 出现这个报错提示,根本原因只有一个--json解析异常,所以请大家直接去关注自己json的返回数据注意检查其返回内容和内容的格式是否正确,至于本文血案的导火索是因为json注释滴问题. 事发 ...
- Listview的使用
最近一个多月忙着使用新的技术来做项目,现在项目上线了,嗯,发现android有些生疏了,所以今天特地写了这一篇博客来相信的讲解一些基础知识,同事呢,也可以让我温故知新一下.进入正题. 什么是listv ...
- Linux学习笔记(6)-文件I/O
持续一个礼拜的出差终于结束了,本次出差真是收益良多,不仅品尝了正宗的大闸蟹,同时也是第一次体验了产品的现场实施流程. 明天开始继续学习Linux! ----------------------分割线- ...
- an excellent capability of C# language and compiler
Sometimes you want to write code that works for different primitive types, and as C# doesn't support ...
- uva10986 堆优化单源最短路径(pas)
var n,m,s,t,v,i,a,b,c:longint;//这道题的代码不是这个,在下面 first,tr,p,q:..]of longint; next,eb,ew:..]of longint; ...
- WPF 四种样式
1.内联样式<TextBlock FontSize="20" Foreground="Blue">好啊</TextBlock> 2.页面 ...
- C#中的Json的序列化和反序列化
Json是一种通用的数据格式,我们在数据交换的时候,经常会用到,下面介绍c#中的json序列化和反序列化,当然也可用在asp.net,silverlight,wpf中.我们在下面实例讲解如何进行Jso ...
- java文件下载,上传,解压方法
1.文件下载(亲测可用) private static final int BUFFER = 2 * 1024;// 缓冲区大小(2k)private boolean isSuccess = true ...
- word-wrap: break-word;和word-break: break-all;的区别
详细查看以下链接.(转载自张鑫旭大神空间) http://www.zhangxinxu.com/wordpress/2015/11/diff-word-break-break-all-word-wra ...