基于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实现两个大数(整数)相乘
Apr 28 Javascript
Javascript判断图片尺寸大小实例分析
Jun 16 Javascript
JavaScript每天必学之数组和对象部分
Sep 17 Javascript
bootstrap基础知识学习笔记
Nov 02 Javascript
Ionic+AngularJS实现登录和注册带验证功能
Feb 09 Javascript
Angular中响应式表单的三种更新值方法详析
Aug 22 Javascript
基于vue.js路由参数的实例讲解——简单易懂
Sep 07 Javascript
js读取本地文件的实例
Dec 22 Javascript
Vuejs 实现简易 todoList 功能 与 组件实例代码
Sep 10 Javascript
解决包含在label标签下的checkbox在ie8及以下版本点击事件无效果兼容的问题
Oct 27 Javascript
Vue实现将数据库中带html标签的内容输出(原始HTML(Raw HTML))
Oct 28 Javascript
JS + HTML 罗盘式时钟的实现
May 21 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/07/05 PHP
php接口和抽象类使用示例详解
2014/03/02 PHP
PHP中4个加速、缓存扩展的区别和选用建议
2014/03/12 PHP
浅谈php正则表达式中的非贪婪模式匹配的使用
2014/11/25 PHP
Thinkphp搜索时首页分页和搜索页保持条件分页的方法
2014/12/05 PHP
Yii1.1中通过Sql查询进行的分页操作方法
2017/03/16 PHP
javascript Array对象基础知识小结
2010/11/16 Javascript
IE6、IE7中setAttribute不支持class/for/rowspan/colspan等属性
2011/08/28 Javascript
不用构造函数(Constructor)new关键字也能实现JavaScript的面向对象
2013/01/11 Javascript
JavaScript中对象property的读取和写入方法介绍
2014/12/30 Javascript
thinkphp 表名 大小写 窍门
2015/02/01 Javascript
javascript禁止访客复制网页内容的实现代码
2015/08/05 Javascript
基于jQuery对象和DOM对象和字符串之间的转化实例
2017/08/08 jQuery
JavaScript canvas实现围绕旋转动画
2017/11/18 Javascript
Angular4的输入属性与输出属性实例详解
2017/11/29 Javascript
利用Node.js检测端口是否被占用的方法
2017/12/07 Javascript
vue.js高德地图实现热点图代码实例
2019/04/18 Javascript
[02:21]2018完美盛典章节片——初心
2018/12/17 DOTA
Python作用域用法实例详解
2016/03/15 Python
Python对文件和目录进行操作的方法(file对象/os/os.path/shutil 模块)
2017/05/08 Python
python3操作mysql数据库的方法
2017/06/23 Python
python实现比较文件内容异同
2018/06/22 Python
Python设计模式之享元模式原理与用法实例分析
2019/01/11 Python
django与小程序实现登录验证功能的示例代码
2019/02/19 Python
Django如何将URL映射到视图
2019/07/29 Python
python Pillow图像处理方法汇总
2019/10/16 Python
python 字段拆分详解
2019/12/17 Python
Python如何使用内置库matplotlib绘制折线图
2020/02/24 Python
pytorch下的unsqueeze和squeeze的用法说明
2021/02/06 Python
从当地商店送来的杂货:Instacart
2018/08/19 全球购物
毕业生就业自荐信
2013/12/04 职场文书
平面设计岗位职责
2013/12/14 职场文书
安全标准化汇报材料
2014/02/03 职场文书
动员大会主持词
2014/03/20 职场文书
医院搬迁方案
2014/06/14 职场文书
关于应聘教师的自荐信
2016/01/28 职场文书