基于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 相关文章推荐
菜单效果
Oct 14 Javascript
TextArea 控件的最大长度问题(js json)
Dec 16 Javascript
JS 无限级 Select效果实现代码(json格式)
Aug 30 Javascript
用Js实现的动态增加表格示例自己写的
Oct 21 Javascript
file控件选择上传文件确定后触发的js事件是哪个
Mar 17 Javascript
浅谈Javascript线程及定时机制
Jul 02 Javascript
JavaScript阻止回车提交表单的方法
Dec 30 Javascript
JavaScript正则表达式匹配 div  style标签
Mar 15 Javascript
JavaScript lodash常见用法系列小结
Aug 24 Javascript
AngularJS 文件上传控件 ng-file-upload详解
Jan 13 Javascript
vue 插件的方法代码详解
Jun 06 Javascript
Vue中关闭弹窗组件时销毁并隐藏操作
Sep 01 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
Ha0k 0.3 PHP 网页木马修改版
2009/10/11 PHP
ThinkPHP缓存方法S()概述
2014/06/13 PHP
extjs中grid中嵌入动态combobox的应用
2011/01/01 Javascript
jQuery中对节点进行操作的相关介绍
2013/04/16 Javascript
JavaScript关闭当前页面(窗口)不带任何提示
2014/03/26 Javascript
js的image onload事件使用遇到的问题
2014/07/15 Javascript
jQuery EasyUI之DataGrid使用实例详解
2016/01/04 Javascript
jQuery点击其他地方时菜单消失的实现方法
2016/04/22 Javascript
js中获取jsp表单中radio类型的值简单实例
2016/08/15 Javascript
node.js与C语言 实现遍历文件夹下最大的文件,并输出路径,大小
2017/01/20 Javascript
jquery操作select取值赋值与设置选中实例
2017/02/28 Javascript
js模拟百度模糊搜索的实例
2017/08/04 Javascript
详解vue-router传参的两种方式
2018/09/10 Javascript
vue安装遇到的5个报错及解决方法
2019/06/12 Javascript
Vue 2.0 侦听器 watch属性代码详解
2019/06/19 Javascript
layui实现form表单同时提交数据和文件的代码
2019/10/25 Javascript
在Django的URLconf中进行函数导入的方法
2015/07/18 Python
使用python实现省市三级菜单效果
2016/01/20 Python
Python SQLite3简介
2018/02/22 Python
Pandas之drop_duplicates:去除重复项方法
2018/04/18 Python
Python Datetime模块和Calendar模块用法实例分析
2019/04/15 Python
Python如何爬取微信公众号文章和评论(基于 Fiddler 抓包分析)
2019/06/28 Python
Python range、enumerate和zip函数用法详解
2019/09/11 Python
wxPython电子表格功能wx.grid实例教程
2019/11/19 Python
面临毕业的毕业生自荐书范文
2014/02/05 职场文书
《乌塔》教学反思
2014/02/17 职场文书
空气环保标语
2014/06/12 职场文书
档案接收函格式
2015/01/30 职场文书
人事专员岗位职责
2015/02/03 职场文书
辞职信标准格式
2015/02/27 职场文书
2015年项目工作总结
2015/04/29 职场文书
思品教学工作总结
2015/08/10 职场文书
大学生暑期社会实践的个人总结!
2019/07/17 职场文书
实用干货:敬酒词大全,帮你应付各种场合
2019/11/21 职场文书
CSS精灵图的原理与使用方法介绍
2022/03/17 HTML / CSS
浅析Python OpenCV三种滤镜效果
2022/04/11 Python