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 相关文章推荐
js 页面刷新location.reload和location.replace的区别小结
Dec 24 Javascript
老鱼 浅谈javascript面向对象编程
Mar 04 Javascript
javascript之通用简单的table选项卡实现(二)
May 09 Javascript
jquery autocomplete自动完成插件的的使用方法
Aug 07 Javascript
Jquery中getJSON在asp.net中的使用说明
Mar 10 Javascript
JS自动适应的图片弹窗实例
Jun 29 Javascript
jQuery简单验证上传文件大小及类型的方法
Jun 02 Javascript
jQuery获取file控件中图片的宽高与大小
Aug 04 Javascript
JS封装的三级联动菜单(使用时只需要一行js代码)
Oct 24 Javascript
ajax的分页查询示例(不刷新页面)
Jan 11 Javascript
从零开始学习Node.js系列教程一:http get和post用法分析
Apr 13 Javascript
EasyUI在Panel上动态添加LinkButton按钮
Aug 11 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
Apache2中实现多网站域名绑定的实现方法
2011/06/01 PHP
PHP输出一个等腰三角形的方法
2015/05/12 PHP
用js判断浏览器是否是IE的比较好的办法
2007/05/08 Javascript
Javascript YUI 读码日记之 YAHOO.util.Dom - Part.3
2008/03/22 Javascript
Prototype ObjectRange对象学习
2009/07/19 Javascript
JS中confirm,alert,prompt函数使用区别分析
2010/04/01 Javascript
javascript 通用简单的table选项卡实现
2010/05/07 Javascript
基于JQuery的动态删除Table表格的行和列的代码
2011/05/12 Javascript
javascript判断机器是否联网的2种方法
2013/08/09 Javascript
JSONP跨域的原理解析及其实现介绍
2014/03/22 Javascript
JavaScript中判断原生函数检查function是否是原生代码
2014/09/09 Javascript
JavaScript之filter_动力节点Java学院整理
2017/06/28 Javascript
Mac中安装nvm的教程分享
2017/12/11 Javascript
Vue 获取数组键名的方法
2018/06/21 Javascript
JavaScript设计模式之单例模式简单实例教程
2018/07/02 Javascript
jQuery实现获取及设置CSS样式操作详解
2018/09/05 jQuery
详解如何创建并发布一个 vue 组件
2018/11/08 Javascript
vue 实现购物车总价计算
2019/11/06 Javascript
VUE table表格动态添加一列数据,新增的这些数据不可以编辑(v-model绑定的数据不能实时更新)
2020/04/03 Javascript
Vue-CLI 3 scp2自动部署项目至服务器的方法
2020/07/24 Javascript
python 函数传参之传值还是传引用的分析
2017/09/07 Python
Python连接phoenix的方法示例
2017/09/29 Python
Python简单生成随机数的方法示例
2018/03/31 Python
对python-3-print重定向输出的几种方法总结
2018/05/11 Python
python获取地震信息 微信实时推送
2019/06/18 Python
Mac PyCharm中的.gitignore 安装设置教程
2020/04/16 Python
keras中的backend.clip用法
2020/05/22 Python
解决keras使用cov1D函数的输入问题
2020/06/29 Python
python 用opencv实现霍夫线变换
2020/11/27 Python
跑步、骑行和铁人三项的高性能眼镜和服装:ROKA
2018/07/06 全球购物
物流专业求职计划书
2014/01/10 职场文书
物流管理系毕业生求职信
2014/06/03 职场文书
群众路线教育实践活动民主生活会个人检查对照思想汇报
2014/10/04 职场文书
2016年学习贯彻十八届五中全会精神心得体会
2016/01/05 职场文书
Go 通过结构struct实现接口interface的问题
2021/10/05 Golang
Python+DeOldify实现老照片上色功能
2022/06/21 Python