基于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自动改变文字大小和颜色的效果的小例子
Aug 02 Javascript
js弹出层永远居中实现思路及代码
Nov 29 Javascript
jQuery 删除或是清空某个HTML元素示例
Aug 04 Javascript
jQuery使用之标记元素属性用法实例
Jan 19 Javascript
浅谈jQuery中事情的动态绑定
Feb 12 Javascript
js中document.referrer实现移动端返回上一页
Feb 22 Javascript
js中作用域的实例解析
Mar 16 Javascript
基于jQuery Easyui实现登陆框界面
Jul 10 jQuery
详解如何更好的使用module vuex
Mar 27 Javascript
微信小程序引入Vant组件库过程解析
Aug 06 Javascript
基于vue3.0.1beta搭建仿京东的电商H5项目
May 06 Javascript
vue中touch和click共存的解决方式
Jul 28 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
一个简单计数器的源代码
2006/10/09 PHP
用php来改写404错误页让你的页面更友好
2013/01/24 PHP
基于php导出到Excel或CSV的详解(附utf8、gbk 编码转换)
2013/06/25 PHP
Symfony学习十分钟入门经典教程
2016/02/03 PHP
Yii2学习笔记之汉化yii设置表单的描述(属性标签attributeLabels)
2017/02/07 PHP
javascript之AJAX框架使用说明
2010/04/24 Javascript
JavaScript实现复制功能各浏览器支持情况实测
2013/07/18 Javascript
jquery操作下拉列表、文本框、复选框、单选框集合(收藏)
2014/01/08 Javascript
JavaScript删除数组元素的方法
2015/03/20 Javascript
jQuery实现滚动切换的tab选项卡效果代码
2015/08/26 Javascript
Node.js实现JS文件合并小工具
2016/02/02 Javascript
结合代码图文讲解JavaScript中的作用域与作用域链
2016/07/05 Javascript
Angular.js基础学习之初始化
2017/03/10 Javascript
JS移动端/H5同时选择多张图片上传并使用canvas压缩图片
2017/06/20 Javascript
vue仿淘宝订单状态的tab切换效果
2020/06/23 Javascript
Vue2仿淘宝实现省市区三级联动
2020/04/15 Javascript
node.js使用免费的阿里云ip查询获取ip所在地【推荐】
2018/09/03 Javascript
Nuxt.js SSR与权限验证的实现
2018/11/21 Javascript
electron-vue利用webpack打包实现多页面的入口文件问题
2019/05/12 Javascript
layer.open回调获取弹出层参数的实现方法
2019/09/10 Javascript
layui layer select 选择被遮挡的解决方法
2019/09/21 Javascript
JS中FileReader类实现文件上传及时预览功能
2020/03/27 Javascript
vue实现购物车功能(商品分类)
2020/04/20 Javascript
[54:47]Liquid vs VP Supermajor决赛 BO 第五场 6.10
2018/07/05 DOTA
在Linux下使用Python的matplotlib绘制数据图的教程
2015/06/11 Python
python 动态加载的实现方法
2017/12/22 Python
英国版MAC彩妆品牌:Illamasqua
2018/04/18 全球购物
MUGLER官方网站:蒂埃里·穆勒香水
2019/11/26 全球购物
意大利在线高尔夫商店:Online Golf
2021/03/09 全球购物
毕业实习个人鉴定范文
2013/12/10 职场文书
成人继续教育实施方案
2014/03/01 职场文书
应届大学生自荐书
2014/06/17 职场文书
安全保卫工作竞聘材料
2014/08/25 职场文书
永远跟党走演讲稿
2014/09/12 职场文书
女性健康讲座主持词
2015/07/04 职场文书
详解nodejs内置模块
2021/05/06 NodeJs