基于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 相关文章推荐
jQuery当鼠标悬停时放大图片的效果实例
Jul 03 Javascript
对JavaScript中this指针的新理解分享
Jan 31 Javascript
JS仿iGoogle自定义首页模块拖拽特效的方法
Feb 13 Javascript
Javascript基于AJAX回调函数传递参数实例分析
Dec 15 Javascript
JS JSOP跨域请求实例详解
Jul 04 Javascript
JS判断form内所有表单是否为空的简单实例
Sep 09 Javascript
jQuery快速高效制作网页交互特效
Feb 24 Javascript
Vue2.0利用 v-model 实现组件props双向绑定的优美解决方案
Mar 13 Javascript
什么是Vue.js框架 为什么选择它?
Oct 17 Javascript
vue基于element的区间选择组件
Sep 07 Javascript
turn.js异步加载实现翻书效果
Jul 25 Javascript
json 带斜杠时如何解析的实现
Aug 12 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新手上路(九)
2006/10/09 PHP
《PHP边学边教》(04.编写简易的通讯录――视频教程1)
2006/12/13 PHP
我的php学习笔记(毕业设计)
2012/02/21 PHP
探讨如何使用SimpleXML函数来加载和解析XML文档
2013/06/07 PHP
php基于mcrypt_encrypt和mcrypt_decrypt实现字符串加密解密的方法
2016/07/12 PHP
phpstudy默认不支持64位php的解决方法
2017/02/20 PHP
小议Function.apply()之二------利用Apply的参数数组化来提高 JavaScript程序性能
2006/11/30 Javascript
jQuery中读取json文件示例代码
2013/05/10 Javascript
Javascript和Java获取各种form表单信息的简单实例
2014/02/14 Javascript
jquery中实现时间戳与日期相互转换
2016/04/12 Javascript
第五章之BootStrap 栅格系统
2016/04/25 Javascript
js实现点击按钮弹出上传文件的窗口
2016/12/23 Javascript
JS 组件系列之 bootstrap treegrid 组件封装过程
2017/04/28 Javascript
浅析JS抽象工厂模式
2017/12/14 Javascript
vue自定义指令的创建和使用方法实例分析
2018/12/04 Javascript
Vue源码解析之Template转化为AST的实现方法
2018/12/14 Javascript
JS隐藏号码中间4位代码实例
2019/04/09 Javascript
JavaScript中工厂函数与构造函数示例详解
2019/05/06 Javascript
js实现轮播图特效
2020/05/28 Javascript
vue使用canvas实现移动端手写签名
2020/09/22 Javascript
python将ip地址转换成整数的方法
2015/03/17 Python
python3.5仿微软计算器程序
2020/03/30 Python
对matplotlib改变colorbar位置和方向的方法详解
2018/12/13 Python
python使用threading.Condition交替打印两个字符
2019/05/07 Python
PyCharm 2020.1版安装破解注册码永久激活(激活到2089年)
2020/09/24 Python
HTML5轻松实现全屏视频背景的示例
2018/04/23 HTML / CSS
专业实习自我鉴定
2013/10/29 职场文书
行政专员工作职责
2013/12/22 职场文书
学年自我鉴定
2014/01/16 职场文书
cf收人广告词大全
2014/03/14 职场文书
小学公民道德宣传日活动总结
2015/03/23 职场文书
2016年党员创先争优承诺书
2016/03/25 职场文书
2019年大学推荐信
2019/06/24 职场文书
商业计划书之服装
2019/09/09 职场文书
pycharm2021激活码使用教程(永久激活亲测可用)
2021/03/30 Python
浅谈MySQL函数
2021/10/05 MySQL