基于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 插件开发备注
Aug 27 Javascript
JS实现鼠标经过好友列表中的好友头像时显示资料卡的效果
Jul 02 Javascript
js带缩略图的图片轮播效果代码分享
Sep 14 Javascript
使用Promise解决多层异步调用的简单学习心得
May 17 Javascript
JS模仿腾讯图片站的图片翻页按钮效果完整实例
Jun 21 Javascript
require、backbone等重构手机图片查看器
Nov 17 Javascript
js实现简易垂直滚动条
Feb 22 Javascript
BootStrap表单控件之文本域textarea
May 23 Javascript
详解ElementUI之表单验证、数据绑定、路由跳转
Jun 21 Javascript
基于casperjs和resemble.js实现一个像素对比服务详解
Jan 10 Javascript
浅谈Node.js爬虫之网页请求模块
Jan 11 Javascript
JS函数节流和防抖之间的区分和实现详解
Jan 11 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设计模式中的工厂模式
2008/06/12 PHP
php上传文件并存储到mysql数据库的方法
2015/03/16 PHP
php解决crontab定时任务不能写入文件问题的方法分析
2019/09/16 PHP
laravel 框架实现无限级分类的方法示例
2019/10/31 PHP
js 蒙版进度条(结合图片)
2010/03/10 Javascript
js模拟类继承小例子
2010/07/17 Javascript
修改jquery里的dialog对话框插件为框架页(iframe) 的方法
2010/09/14 Javascript
jQuery EasyUI API 中文文档 - Calendar日历使用
2011/10/19 Javascript
JS实现根据出生年月计算年龄
2014/01/10 Javascript
jquery实现倒计时代码分享
2014/06/13 Javascript
json字符串之间的相互转换示例代码
2014/08/21 Javascript
深入浅析AngularJS和DataModel
2016/02/16 Javascript
如何让一个json文件显示在表格里【实现代码】
2016/05/09 Javascript
Javascript基础教程之比较null和undefined值
2016/05/16 Javascript
早该知道的7个JavaScript技巧
2016/06/21 Javascript
canvas绘图不清晰的解决方案
2017/02/28 Javascript
在小程序中使用Echart图表的示例代码
2018/08/02 Javascript
jQuery 实现批量提交表格多行数据的方法
2018/08/09 jQuery
vue elementUI table 自定义表头和行合并的实例代码
2019/05/22 Javascript
JavaScript canvas绘制渐变颜色的矩形
2020/02/18 Javascript
Vue+Element UI 树形控件整合下拉功能菜单(tree + dropdown +input)
2020/08/28 Javascript
Python 创建子进程模块subprocess详解
2015/04/08 Python
Python正则表达式知识汇总
2017/09/22 Python
Python日期时间对象转换为字符串的实例
2018/06/22 Python
pycharm编写spark程序,导入pyspark包的3中实现方法
2019/08/02 Python
Django 对象关系映射(ORM)源码详解
2019/08/06 Python
HTML5中使用postMessage实现Ajax跨域请求的方法
2016/04/19 HTML / CSS
台湾租车首选品牌:IWS艾维士租车
2019/05/03 全球购物
Bitiba意大利:在线宠物商店
2020/10/31 全球购物
班长自荐书范文
2014/02/11 职场文书
2015年教学工作总结
2015/04/02 职场文书
班主任经验交流心得体会
2015/11/02 职场文书
喜迎建国70周年:有关爱国的名言名句
2019/09/24 职场文书
SpringBoot连接MySQL获取数据写后端接口的操作方法
2021/11/02 MySQL
微信小程序结合ThinkPHP5授权登陆后获取手机号
2021/11/23 PHP