基于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中style属性
Oct 11 Javascript
基于JQuery的一句话搞定手风琴菜单
Sep 14 Javascript
JavaScript原生对象之String对象的属性和方法详解
Mar 13 Javascript
JS实现控制表格行内容垂直对齐的方法
Mar 30 Javascript
js实现仿爱微网两级导航菜单效果代码
Aug 31 Javascript
js仿手机页面文件下拉刷新效果
Oct 14 Javascript
socket.io实现在线群聊功能
Apr 07 Javascript
Django1.7+JQuery+Ajax验证用户注册集成小例子
Apr 08 jQuery
在React 组件中使用Echarts的示例代码
Nov 08 Javascript
完美解决手机网页中输入框被输入法遮挡的问题
Dec 19 Javascript
Vue实现美团app的影院推荐选座功能【推荐】
Aug 29 Javascript
VUE前端从后台请求过来的数据进行转换数据结构操作
Nov 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
vBulletin Forum 2.3.xx SQL Injection
2006/10/09 PHP
php object转数组示例
2014/01/15 PHP
用 Composer构建自己的 PHP 框架之基础准备
2014/10/30 PHP
php实现图片以base64显示的方法
2016/10/13 PHP
PHP5.6新增加的可变函数参数用法分析
2017/08/25 PHP
php微信公众号开发之简答题
2018/10/20 PHP
让innerHTML的脚本也可以运行起来
2006/07/01 Javascript
监控 url fragment变化的js代码
2010/04/19 Javascript
javascript中注册和移除事件的4种方式
2013/03/20 Javascript
一个CSS+jQuery实现的放大缩小动画效果
2014/02/19 Javascript
利用a标签自动解析URL分析网址实例
2014/10/20 Javascript
js使用Array.prototype.sort()对数组对象排序的方法
2015/01/28 Javascript
innerHTML中标签可以换行的方法汇总
2015/08/14 Javascript
微信小程序  生命周期详解
2016/10/27 Javascript
jquery 正整数数字校验正则表达式
2017/01/10 Javascript
Echarts基本用法_动力节点Java学院整理
2017/08/11 Javascript
JavaScript判断变量名是否存在数组中的实例
2017/12/28 Javascript
vue ssr服务端渲染(小白解惑)
2019/11/10 Javascript
python里将list中元素依次向前移动一位
2014/09/12 Python
Python多线程下载文件的方法
2015/07/10 Python
python获取交互式ssh shell的方法
2019/02/14 Python
python爬取cnvd漏洞库信息的实例
2019/02/14 Python
详解python中docx库的安装过程
2019/11/08 Python
你可能不知道的Python 技巧小结
2020/01/29 Python
Python应用实现双指数函数及拟合代码实例
2020/06/19 Python
Python环境管理virtualenv&amp;virtualenvwrapper的配置详解
2020/07/01 Python
Python安装并操作redis实现流程详解
2020/10/13 Python
松本清官方海外旗舰店:日本最大的药妆连锁店
2017/11/21 全球购物
会计师事务所审计实习自我鉴定
2013/09/20 职场文书
临床医学专业学生的自我评价分享
2013/11/21 职场文书
行政主管职责范本
2014/03/07 职场文书
体育教师求职信
2014/06/30 职场文书
2014初中数学教研组工作总结
2014/12/19 职场文书
2015年感恩母亲节活动方案
2015/05/04 职场文书
2015年终个人政治思想工作总结
2015/11/24 职场文书
redis protocol通信协议及使用详解
2022/07/15 Redis