基于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 相关文章推荐
百度留言本js 大家可以参考下
Oct 13 Javascript
学习JavaScript的最佳方法分享
Oct 21 Javascript
js展开闭合效果演示代码
Jul 24 Javascript
div浮层,滚动条移动,位置保持不变的4种方法汇总
Dec 11 Javascript
JS实现淘宝支付宝网站的控制台菜单效果
Sep 28 Javascript
微信小程序 页面跳转及数据传递详解
Mar 14 Javascript
Node学习记录之cluster模块
May 31 Javascript
vue+springboot前后端分离实现单点登录跨域问题解决方法
Jan 30 Javascript
浅析Vue中method与computed的区别
Mar 06 Javascript
解决vue build打包之后首页白屏的问题
Mar 06 Javascript
Vue.js最佳实践(五招助你成为vuejs大师)
May 04 Javascript
vue组件之间数据传递的方法实例分析
Feb 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常用函数的使用汇总
2013/06/08 PHP
浅析PHP绘图技术
2013/07/03 PHP
PHP中用mysqli面向对象打开连接关闭mysql数据库的方法
2016/11/05 PHP
phpstudy的php版本自由修改的方法
2017/10/18 PHP
JavaScript的document对象和window对象详解
2010/12/30 Javascript
在js文件中写el表达式取不到值的原因及解决方法
2013/12/23 Javascript
JS 日期比较大小的简单实例
2014/01/13 Javascript
Angular入口组件(entry component)与声明式组件的区别详解
2018/04/09 Javascript
seajs下require书写约定实例分析
2018/05/16 Javascript
Vue-router 中hash模式和history模式的区别
2018/07/24 Javascript
vue 项目接口管理的实现
2019/01/17 Javascript
VUE接入腾讯验证码功能(滑块验证)备忘
2019/05/07 Javascript
JavaScript canvas仿代码流瀑布
2020/02/10 Javascript
vuejs element table 表格添加行,修改,单独删除行,批量删除行操作
2020/07/18 Javascript
[01:15:18]2014 DOTA2国际邀请赛中国区预选赛 LGD VS Speed Gaming.cn
2014/05/22 DOTA
python调用cmd复制文件代码分享
2013/12/27 Python
Python中zip()函数用法实例教程
2014/07/31 Python
Python写的一个简单监控系统
2015/06/19 Python
让Python代码更快运行的5种方法
2015/06/21 Python
利用Anaconda简单安装scrapy框架的方法
2018/06/13 Python
python实现五子棋游戏
2019/06/18 Python
Python 使用PyQt5 完成选择文件或目录的对话框方法
2019/06/27 Python
在Python中合并字典模块ChainMap的隐藏坑【推荐】
2019/06/27 Python
Django获取该数据的上一条和下一条方法
2019/08/12 Python
Python 使用 docopt 解析json参数文件过程讲解
2019/08/13 Python
Django通过dwebsocket实现websocket的例子
2019/11/15 Python
Python实现栈的方法详解【基于数组和单链表两种方法】
2020/02/22 Python
pytorch判断是否cuda 判断变量类型方式
2020/06/23 Python
20佳惊艳的HTML5应用程序示例分享
2011/05/03 HTML / CSS
全球领先的在线cosplay服装商店:RoleCosplay
2020/01/18 全球购物
幼儿园教学管理制度
2014/02/04 职场文书
门面房租房协议书
2014/08/20 职场文书
公共艺术专业自荐信
2014/09/01 职场文书
2015年班组长工作总结
2015/04/10 职场文书
如何搭建 MySQL 高可用高性能集群
2021/06/21 MySQL
mysql字段为NULL索引是否会失效实例详解
2022/05/30 MySQL