bootstrap data与jquery .data


Posted in Javascript onJuly 07, 2014

jquery官网对.data函数描述是:在匹配元素上存储任意相关数据 或 返回匹配的元素集合中的第一个元素的给定名称的数据存储的值。

存储键值(key/value):

$("body").data("foo", 52);

$("body").data("bar", { myType: "test", count: 40 });

$("body").data({ baz: [ 1, 2, 3 ] });

 
  取键值
 

$("body").data("foo"); // 52

$("body").data(); // { foo: 52, bar: { myType: "test", count: 40 }, baz: [ 1, 2, 3 ] }

以上这些都很容易掌握和理解,今天在看bootstrap 的弹窗掩码的时候遇到了这样一段代码让我产生了疑惑

$(document).on('click.modal.data-api', '[daTa-toggle="modal"]', function (e) {
  alert($(this).data().toggle) //这行是我加入的代码 打印的值是modal
  var $this = $(this)
   , href = $this.attr('href')
   , $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) //strip for ie7
   , option = $target.data('modal') ? 'toggle' : $.extend({ remote:!/#/.test(href) && href }, $target.data(), $this.data())  
  e.preventDefault()
  $target
   .modal(option)
   .one('hide', function () {
    $this.focus()
   })
 })

代码中的三目运算符 $target.data('modal')?'toggle' : $.extend({ remote:!/#/.test(href) && href }, $target.data(), $this.data())

是判断窗口是否是第一次渲染 。第一次渲染窗口的时候执行了

option = $.extend({ remote:!/#/.test(href) && href }, $target.data(), $this.data()) //结果是 option= {remote: false,toggle: "modal"}

$target.data()是空对象{} ,$this.data()值是{toggle: "modal"} 。这里不经要问 $this.data() 的返回值哪来的

看了下html代码,刚好与被绑定click方法的dom对象的属性值一样,以下是被绑定的dom对象的html代码

<a href="#myModal" rel="external nofollow" rel="external nofollow" role="button" class="btn" data-toggle="modal">Launch demo modal</a>

我加入的代码alert($(this).data().toggle)打印的值是modal ,所以这里只能是jquery做的文章,于是我研究了jquery的源码发现果然真是 !

以下是jQuery.fn.data函数中的部分代码 , 当key未定义也就是调用 .data() 未传参数时会将属性名为data-开头的键值对存入匹配元素上。

本例中<a href="#myModal" rel="external nofollow" rel="external nofollow" role="button" class="btn" data-toggle="modal">Launch demo modal</a>,将{toggle:"modal"}键值对存入

有兴趣的同学可以去试调以下jquery代码

// Gets all values
    if ( key === undefined ) {
      if ( this.length ) {
        data = jQuery.data( elem );
        if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) {
          attrs = elem.attributes;
          for ( ; i < attrs.length; i++ ) {
            name = attrs[i].name;
            if ( name.indexOf("data-") === 0 ) {
              name = jQuery.camelCase( name.slice(5) );

              dataAttr( elem, name, data[ name ] );
            }
          }
          jQuery._data( elem, "parsedAttrs", true );
        }
      }
      return data;
    }

我再去详细阅读了jquery官网的帮助文档有如下一段话
HTML5 data-* Attributes(HTML5 data-* 属性)
从jQuery 1.4.3起, HTML 5 data- 属性 将自动被引用到jQuery的数据对象中。嵌入式破折号处理属性( attributes)的方式在 jQuery 1.6 中已经改变,以使之符合W3C HTML5 规范.

举个例子, 给定下面的HTML:

<div data-role="page" data-last-value="43" data-hidden="true" data-options='{"name":"John"}'></div>

下面所有的 jQuery 代码都能运行。

$("div").data("role") === "page";
$("div").data("lastValue") === 43;
$("div").data("hidden") === true;
$("div").data("options").name === "John";
Javascript 相关文章推荐
jquery拖动插件(jquery.drag)使用介绍
Jun 18 Javascript
JavaScript中Math对象方法使用概述
Jan 02 Javascript
jQuery实现鼠标可拖动调整表格列宽度
May 26 Javascript
jQuery的promise与deferred对象在异步回调中的作用
May 03 Javascript
老生常谈JQuery data方法的使用
Sep 09 Javascript
Validform表单验证总结篇
Oct 31 Javascript
完美解决浏览器跨域的几种方法(汇总)
May 08 Javascript
微信小程序 页面跳转事件绑定的实例详解
Sep 20 Javascript
vue-awesome-swiper滑块插件使用方法详解
Nov 27 Javascript
详解小程序输入框闪烁及重影BUG解决方案
Aug 31 Javascript
Puppeteer环境搭建的详细步骤
Sep 21 Javascript
JS实现指定区域的全屏显示功能示例
Apr 25 Javascript
函数式 JavaScript(一)简介
Jul 07 #Javascript
5款JavaScript代码压缩工具推荐
Jul 07 #Javascript
jquery easyui使用心得
Jul 07 #Javascript
Node.js与PHP、Python的字符处理性能对比
Jul 06 #Javascript
我的Node.js学习之路(四)--单元测试
Jul 06 #Javascript
我的Node.js学习之路(三)--node.js作用、回调、同步和异步代码 以及事件循环
Jul 06 #Javascript
我的Node.js学习之路(二)NPM模块管理
Jul 06 #Javascript
You might like
PHP与MySQL开发中页面乱码的产生与解决
2008/03/27 PHP
PHP/ThinkPHP实现批量打包下载文件的方法示例
2017/07/31 PHP
javascript XML数据显示为HTML一例
2008/12/23 Javascript
拖动布局之保存布局页面cookies篇
2010/10/29 Javascript
取得窗口大小 兼容所有浏览器的js代码
2011/08/09 Javascript
JavaScript中使用构造器创建对象无需new的情况说明
2012/03/01 Javascript
精心挑选的15款优秀jQuery 本特效插件和教程
2012/08/06 Javascript
jQuery去掉字符串起始和结尾的空格(多种方法实现)
2013/04/01 Javascript
jQuery弹性滑动导航菜单实现思路及代码
2013/05/02 Javascript
js判断手机号运营商的方法
2015/10/23 Javascript
简单了解Backbone.js的Model模型以及View视图的源码
2016/02/14 Javascript
基于Vue.js的表格分页组件
2016/05/22 Javascript
jQuery图片轮播插件——前端开发必看
2016/05/31 Javascript
Javascript中indexOf()和lastIndexOf应用方法实例
2016/08/24 Javascript
Javascript农历与公历相互转换的简单实例
2016/10/09 Javascript
BootStrap 下拉菜单点击之后不会出现下拉菜单(下拉菜单不弹出)的解决方案
2016/12/14 Javascript
微信小程序实战之轮播图(3)
2017/04/17 Javascript
浅谈JavaScript 声明提升
2020/09/14 Javascript
详细解析Python中的变量的数据类型
2015/05/13 Python
python 对key为时间的dict排序方法
2018/10/17 Python
基于python历史天气采集的分析
2019/02/14 Python
在Django中实现添加user到group并查看
2019/11/18 Python
Python利用 utf-8-sig 编码格式解决写入 csv 文件乱码问题
2020/02/21 Python
python实现小程序推送页面收录脚本
2020/04/20 Python
Python中lru_cache的使用和实现详解
2021/01/25 Python
python爬取股票最新数据并用excel绘制树状图的示例
2021/03/01 Python
美国单身专业人士在线约会网站:EliteSingles
2019/03/19 全球购物
师范大学应届生求职信
2013/11/21 职场文书
小学教师听课制度
2014/02/01 职场文书
企业公益活动策划方案
2014/08/24 职场文书
个人作风建设总结
2014/10/23 职场文书
工作简报格式范文
2015/07/21 职场文书
python中的None与NULL用法说明
2021/05/25 Python
SQL实现LeetCode(180.连续的数字)
2021/08/04 MySQL
HTML常用标签超详细整理
2022/03/19 HTML / CSS
Apache Hudi集成Spark SQL操作hide表
2022/03/31 Servers