基于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中 For, While与递归的用法
May 07 Javascript
javascript级联下拉列表实例代码(自写)
May 10 Javascript
js动态创建表格,删除行列的小例子
Jul 20 Javascript
JS如何将UTC格式时间转本地格式
Sep 04 Javascript
Jquery的Tabs内容轮换效果实现代码,几行搞定
Feb 12 Javascript
详解解决使用axios发送json后台接收不到的问题
Jun 27 Javascript
JS中实现浅拷贝和深拷贝的代码详解
Jun 05 Javascript
了解Javascript中函数作为对象的魅力
Jun 19 Javascript
使用Angular9和TypeScript开发RPG游戏的方法
Mar 25 Javascript
解决Vue的文本编辑器 vue-quill-editor 小图标样式排布错乱问题
Aug 03 Javascript
js实现鼠标点击飘爱心效果
Aug 19 Javascript
解决vue 使用axios.all()方法发起多个请求控制台报错的问题
Nov 09 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 gbk环境下json_dencode传送来的汉字
2012/11/13 PHP
PHP输出XML到页面的3种方法详解
2013/06/06 PHP
phpStudy配置多站点多域名方法及遇到的403错误解决方法
2017/10/19 PHP
JS实现浏览器菜单命令
2006/09/05 Javascript
深入理解JavaScript系列(7) S.O.L.I.D五大原则之开闭原则OCP
2012/01/15 Javascript
Javascript Boolean、Nnumber、String 强制类型转换的区别详细介绍
2012/12/13 Javascript
js 弹出新页面避免被浏览器、ad拦截的一种新方法
2014/04/30 Javascript
jQuery异步验证用户名是否存在示例代码
2014/05/21 Javascript
jquery实现倒计时代码分享
2014/06/13 Javascript
使用jQueryMobile实现滑动翻页效果的方法
2015/02/04 Javascript
JS中使用mailto实现将用户在网页中输入的内容传递到本地邮件客户端
2016/10/08 Javascript
JavaScript 自定义事件之我见
2017/09/25 Javascript
JS简单实现点击跳转登陆邮箱功能的方法
2017/10/31 Javascript
vue中前进刷新、后退缓存用户浏览数据和浏览位置的实例讲解
2018/09/21 Javascript
移动端滑动切换组件封装 vue-swiper-router实例详解
2018/11/25 Javascript
vue动态添加路由addRoutes之不能将动态路由存入缓存的解决
2019/02/19 Javascript
微信小程序wx.navigateTo中events属性实现页面间通信传值,数据同步
2019/07/13 Javascript
JS实现在线ps功能详解
2019/07/31 Javascript
微信小程序 生成携带参数的二维码
2019/10/23 Javascript
[03:46]DOTA2英雄基础教程 维萨吉
2013/12/11 DOTA
[14:36]2014 DOTA2国际邀请赛中国区预选赛5.21 Orenda VS NE
2014/05/22 DOTA
[01:31]完美与DOTA2历程
2014/07/31 DOTA
python简单读取大文件的方法
2016/07/01 Python
Python读取Word(.docx)正文信息的方法
2018/03/15 Python
python 实现在txt指定行追加文本的方法
2018/04/29 Python
Python实现求解一元二次方程的方法示例
2018/06/20 Python
numpy矩阵数值太多不能全部显示的解决
2020/05/14 Python
Carmen Sol官网:购买果冻鞋、手袋和配件
2021/01/01 全球购物
酒店销售经理岗位职责
2014/01/31 职场文书
颁奖典礼主持词
2014/03/25 职场文书
股权转让协议书
2014/04/12 职场文书
维护民族团结心得体会2016
2016/01/15 职场文书
500字作文之关于爸爸
2019/11/14 职场文书
八年级作文之我的母亲
2019/12/10 职场文书
Android自定义双向滑动控件
2022/04/19 Java/Android
python数据分析之单因素分析线性拟合及地理编码
2022/06/25 Python