.data()
.data( key, value )
描述:存储与匹配的元素相关的任意数据。
.data()
方法允许我们把任何数据类型附加到DOM元素上,不会循环引用,因此不会内存泄漏。
我们可以为一个元素设置若干个不同的值,然后在以后检索它们:
$( "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 ] }
在jQuery 1.4.3中,利用.data(obj)
设置一个元素的数据对象,扩展了先前存储在元素上的数据。
在jQuery 1.4.3以前的版本中(从jQuery 1.4开始),.data()
方法彻底代替了所有数据,而不是扩展数据对象。如果你正在使用第三方的插件,可能不建议你完全替代元素的数据对象,因为插件可能也设置了数据。
由于浏览器与插件和外部代码交互的方式,.data()
方法不能用在<object>
上(除非它是一个Flash插件),也不能用在<applet>
或<embed;>
元素上。
其它说明
- 注意,这个方法目前不能为在XML document上设置数据提供一个跨平台的支持,因为Internet Explorer不允许通过自定义属性附加数据。
undefined
不能被识别为一个数据值。调用诸如.code( "name", undefined )
将返回调用它的jQuery对象,允许连缀。
示例
在一个DIV元素上存储一个值,然后检索它。
<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <title>data demo</title> <style> div { color: blue; } span { color: red; } </style> <script src="https://code.jquery.com/jquery-1.10.2.js"></script> </head> <body> <div> The values stored were <span></span> and <span></span> </div> <script> $( "div" ).data( "test", { first: 16, last: "pizza!" } ); $( "span:first" ).text( $( "div" ).data( "test" ).first ); $( "span:last" ).text( $( "div" ).data( "test" ).last ); </script> </body> </html>
演示结果
.data( key, value )
描述:返回匹配的元素集合中第一个元素的某段已存储的命名数据值,通过.data( name, value )
设置,或者通过HTML5元素属性data-*
设置。
.data()
方法允许我们把任何类型的数据附加到DOM元素上,不会循环引用,因此不会内存泄漏。我们在同一时间里对一个元素可以检索几个不同的值,或者设置几个不同的值:
alert( $( "body" ).data( "foo" ) ); alert( $( "body" ).data() );
上面的行提醒了设置在body
元素上的数据值。如果根本没有数据设置在那个元素上,将返回undefined
。
alert( $( "body" ).data( "foo" ) ); // undefined $( "body" ).data( "bar", "foobar" ); alert( $( "body" ).data( "bar" ) ); // foobar
HTML5 data-*元素属性
自从jQuery 1.4.3,HTML 5的元素属性data-会自动推加到jQuery的数据对象上。带嵌入的破折号的元素属性的这种对待方式在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";
上面代码中的第二句正确地写到了元素的data-last-value
元素属性上了。万一没有数据通过关键词存储,jQuery会在元素的元素属性中搜索,把驼峰大小写的字符串转换成一个破折号字符串,然后在结果中前插入data-
。因此,字符串lastValue
被转换成了data-last-value
。
会作各种尝试,以把字符串转换成一个JavaScript值(这包括了布尔值、数字、对象、数组和null)。一个值一定会转换成数字,如果这样做不会改变值的表达法。例如,“1E02”和“100.00”等同于数字(数量值为100),但是把它们转换成数字会更改它们的表达法,所以它们被留作字符串。字符串值“100”会被转换成数字100。
当data元素属性是一个对象时(以'{'开始)或者是一个数组时(以'['开始),则jQuery.parseJSON
将用来解析这个字符串;它必须遵守有效的JSON句法。如果这个值不能解析为一个JavaScript值,它被留作一个字符串。
要想把元素属性的值检索为字符串,而不试图转换它,请使用attr()
方法。
该data-元素属性在data属性第一次访问的时候推加进去,然后不再访问或者改变(所有的data值都存储在jQuery内部对象中)。
不带参数地调用.data()
会检索所有的值,作是一个JavaScript对象。该对象可以安全地缓存在变量中,只要不用.data(obj)
设置一个新对象。使用该对象直接读取或设置值比对.data()
作单个调用来读取或设置每个值更快。
var mydata = $( "#mydiv" ).data(); if ( mydata.count < 9 ) { mydata.count = 43; mydata.status = "embiggened"; }
其它说明
- 注意,对于在XML document上设置数据,这个方法目前并不提供跨平台支持,因为Internet Explorer不允许通过自定义属性附加数据。
示例
获得存储在一个元素上,名称为“blah”的数据。
<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <title>data demo</title> <style> div { margin: 5px; background: yellow; } button { margin: 5px; font-size: 14px; } p { margin: 5px; color: blue; } span { color: red; } </style> <script src="https://code.jquery.com/jquery-1.10.2.js"></script> </head> <body> <div>A div</div> <button>Get "blah" from the div</button> <button>Set "blah" to "hello"</button> <button>Set "blah" to 86</button> <button>Remove "blah" from the div</button> <p>The "blah" value of this div is <span>?</span></p> <script> $( "button" ).click(function() { var value; switch ( $( "button" ).index( this ) ) { case 0 : value = $( "div" ).data( "blah" ); break; case 1 : $( "div" ).data( "blah", "hello" ); value = "Stored!"; break; case 2 : $( "div" ).data( "blah", 86 ); value = "Stored!"; break; case 3 : $( "div" ).removeData( "blah" ); value = "Removed!"; break; } $( "span" ).text( "" + value ); }); </script> </body> </html>
演示结果