基于dataset的使用和图片延时加载的实现方法


Posted in Javascript onDecember 11, 2017

首先,先介绍一下关于javascript中dataset属性。。

html5中可以使用data-前缀设置我们需要的自定义属性,来进行一些数据的存放。

下面是元素应用data属性的一个例子:

<div id="day-meal-expense" data-drink="tea" data-food="noodle" data-meal="lunch">$18.3</div>

要想获取某个属性的值,可以像下面这样使用dataset对象:

var expenseday=document.getElementById('day-meal-expense');
 var typeOfDrink=expenseday.dataset.drink;
 console.log(typeOfDrink);//tea
 console.log(expenseday.dataset.food);//noodle
 console.log(expenseday.dataset.meal);//lunch

如果浏览器支持dataset,则会弹出注释内容,如果浏览器不支持dataset则会报错,无法获取属性drink/food/meal的值:对象为null或未定义(如IE9版本).

data属性基本上所有的浏览器都是支持的,但是dataset对象支持的就比较特殊了,目前仅在Opera 11.1+,Chrome 9+下可以通过javascript,使用dataset访问你自定义的data属性.至于其他浏览器,FireFox 6+(未出)以及Safari 6+(未出)会支持dataset对象,至于IE浏览器,目前看来还是遥遥无期的趋势.

问:不是有getAttribute来获取自定义属性么。要这个干嘛??

答:如果使用传统的方法获取属性值应该会类似下面:

var typeOfDrink=document.getElementById('day-meal-expense').getAttribute('data-drink');

现在,如果我们要获得多个自定义的属性值,就要用下面N行代码来实现了:

var attrs=expenseday.attributes, expense={},i,j;
for (i=0,j=attrs.length;i<j;i++){
 if(attrs[i].name.substring(0,5)=='data-'){
 expense[attrs[i].name.substring(5)]=attrs[i].value;
 }
}

而使用dataset属性,我们根本不需要任何循环去获取你想要的那个值,直接秒杀:

expense=document.getElementById('day-meal-expense').dataset;

问:怎么操作这玩意~

答:可以像下面这样操作名-值对:

charInput=[];
 for(var item in expenseday){
 charInput.push(expenseday[item]);
 }

让所有的自定义属性塞到一个数组中.

如果你想删除一个data属性,可以这么做:

delete expenseday.dataset.meal;
console.log(expenseday.dataset.meal)//undefined

如果你想给元素添加一个属性,可以这么做:

expenseday.dataset.dessert='icecream';
console.log(expenseday.dataset.dessert);//icecream

dataset并不是典型意义上的JavaScript对象,而是个DOMStringMap对象,DOMStringMap是HTML5一种新的含有多个名-值对的交互变量.

下面来个实际的应用吧~

(当然图片地址肯定是空的。想要看效果的自己去加个图片地址,这个效果附上图片也是看不出什么所以就不上截图了)

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>图片延迟加载</title>
 <style>
 #box{
  width: 100%;
  height: 500px;
 }
 #box img{
  width: 100%;
  height: 500px;
  transition: 1s;
  opacity: 0;
 }
 </style>

</head>
<body>
 <div id="box"></div>
 <script type="text/javascript">
 var data=["img/1.jpg","img/2.jpg","img/3.jpg","img/4.jpg"]
 var box=document.getElementById('box');
 // var img=document.createElement(img);
 for (var i = 0; i < data.length; i++) {
  var img=document.createElement('img');
  img.dataset.src=data[i];
  // img.style.opacity=1;
  box.appendChild(img);
  // console.log(box);
 }
 var imgs=document.querySelectorAll('img');
 window.addEventListener('scroll',loadFn);
 window.addEventListener('load',loadFn);
 function loadFn(){
  for (var i = 0; i < imgs.length; i++) {
  if(imgs[i].getBoundingClientRect().top<window.innerHeight){
   if(imgs[i].dataset.src){
   imgs[i].src=imgs[i].dataset.src;
   imgs[i].style.opacity=1;
   imgs[i].removeAttribute('data-src');
   }
  }
  }
 }
 </script>
</body>
</html>

以上这篇基于dataset的使用和图片延时加载的实现方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript 继承详解(四)
Jul 13 Javascript
js中document.getElementByid、document.all和document.layers区分介绍
Dec 08 Javascript
javascript实现鼠标放上后下边对应内容变换的效果
Aug 06 Javascript
JavaScript编码风格指南(中文版)
Aug 26 Javascript
Vue自定义指令使用方法详解
Aug 21 Javascript
vue2.0设置proxyTable使用axios进行跨域请求的方法
Oct 19 Javascript
JS关于刷新页面的相关总结
May 09 Javascript
微信小程序实现留言板功能
Nov 02 Javascript
vue路由守卫及路由守卫无限循环问题详析
Sep 05 Javascript
jQuery/JS监听input输入框值变化实例
Oct 17 jQuery
Vue如何实现监听组件原生事件
Jul 03 Javascript
springboot+vue+对接支付宝接口+二维码扫描支付功能(沙箱环境)
Oct 15 Javascript
Angular自定义组件实现数据双向数据绑定的实例
Dec 11 #Javascript
node.js将MongoDB数据同步到MySQL的步骤
Dec 10 #Javascript
Node.js中sequelize时区的配置方法
Dec 10 #Javascript
node.js多个异步过程中判断执行是否完成的解决方案
Dec 10 #Javascript
关于react中组件通信的几种方式详解
Dec 10 #Javascript
vue项目中v-model父子组件通信的实现详解
Dec 10 #Javascript
Angular项目从新建、打包到nginx部署全过程记录
Dec 09 #Javascript
You might like
PHP微信刮刮卡 附微信接口
2016/07/22 PHP
PHP 模拟登陆功能实例详解
2019/09/10 PHP
javascript Onunload与Onbeforeunload使用小结
2009/12/31 Javascript
jQuery实现的立体文字渐变效果
2010/05/17 Javascript
Js如何判断客户端是PC还是手持设备简单分析
2012/11/22 Javascript
javascript实用小函数使用介绍
2013/11/11 Javascript
Juery解决tablesorter中文排序和字符范围的方法
2015/05/06 Javascript
javascript跨域总结之window.name实现的跨域数据传输
2015/11/01 Javascript
BootStrap中的表单大全
2016/09/07 Javascript
seajs学习教程之基础篇
2016/10/20 Javascript
vuejs选中当前样式active的实例
2018/08/22 Javascript
用vue-cli开发vue时的代理设置方法
2018/09/20 Javascript
详解webpack+ES6+Sass搭建多页面应用
2018/11/05 Javascript
jQuery实现的简单日历组件定义与用法示例
2018/12/24 jQuery
iphone刘海屏页面适配方法
2019/05/07 Javascript
Vue中使用matomo进行访问流量统计的实现
2019/11/05 Javascript
JavaScript中this函数使用实例解析
2020/02/21 Javascript
Vue实现仿iPhone悬浮球的示例代码
2020/03/13 Javascript
Vue实现一种简单的无限循环滚动动画的示例
2021/01/10 Vue.js
python操作mysql中文显示乱码的解决方法
2014/10/11 Python
Python线程的两种编程方式
2015/04/14 Python
用Python实现将一张图片分成9宫格的示例
2019/07/05 Python
详解Python3迁移接口变化采坑记
2019/10/11 Python
win10子系统python开发环境准备及kenlm和nltk的使用教程
2019/10/14 Python
Python3 shutil(高级文件操作模块)实例用法总结
2020/02/19 Python
python基于socket模拟实现ssh远程执行命令
2020/12/05 Python
html5关于外链嵌入页面通信问题(postMessage解决跨域通信)
2020/07/20 HTML / CSS
Swanson中国官网:美国斯旺森健康产品公司
2021/03/01 全球购物
.NET方向面试题
2014/11/20 面试题
申请任职学生会干部自荐书范文
2014/02/13 职场文书
安全月活动总结
2014/05/05 职场文书
事业单位考察材料范文
2014/12/25 职场文书
小学生思想品德评语
2014/12/31 职场文书
2015年信访工作总结
2015/04/07 职场文书
2016年教代会开幕词
2016/03/04 职场文书
Python打包exe时各种异常处理方案总结
2021/05/18 Python