.data()

存储与匹配的元素相关联的任意数据,或者针对匹配的元素集合中第一个元素,返回命名数据存储的值。

.data( key, value )返回类型:jQuery

描述:在匹配的元素上存储任意数据。

  • 增补版本:1.2.3.data( key, value )

    • key
      类型:String
      一个字符串,用来命名要设置的数据片段。
    • value
      类型:Anything
      新的数据值;这可以是任意JavaScript类型,除了undefined
  • 增补版本:1.4.3.data( obj )

    • obj
      类型:Object
      要更新的数据的键值对对象。

.data()方法允许我们把任何类型的数据附加到DOM元素上,以此避免了循环引用以及它引起的内存泄漏风险。

我们可以在一个元素上设置若干个不同的值,以后检索这些值:

1
2
3
4
5
$( "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()方法完全替换了所有的数据,而不仅是扩展数据对象。如果你正在使用第三方插件,完全替代替元素的数据对象也许是不可取的,因为插件也有可能设置数据。

jQuery 3改变了此方法的行为,把它对齐到Dataset API 规范文档。具体来说,jQuery 3把"-"(U+002D)的每个二字符序列转换成一个小写ASCII字母后面跟着字母的大写版本,遵照the algorithm of the Dataset API的定义。编写$( "body" ).data( { "my-name": "aValue" } ).data();将返回{ myName: "aValue" }

由于浏览器与插件和外部代码交互的方式,.data()方法不能在<object>上面使用(除非它是一个Flash插件),也不能在<applet><embed>元素上使用。

补充说明:

  • 请注意,针对XML文档中的数据设置,此方法当前并不提供跨平台支持,因为Internet Explorer 并不允许通过expando属性来附加数据。
  • undefined不能被识别为数据值。调用.data( "name", undefined )将返回调用此方法的jQuery对象,允许连缀。

示例:

把一个值存储在div元素上,然后从该div元素上检索该值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<!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 )返回类型:Object

描述:返回针对jQuery集合中第一个元素存储的命名数据的值,它是用data(name, value)设置的,或者是用HTML5 data-*特性设置的。

.data()方法允许我们以安全的方式把任何类型的数据附加到DOM元素上,避免循环引用以及它引起的内存泄漏风险。我们可以针对一个元素同时检索一些不同的值,或者设置不同的值:

1
2
alert( $( "body" ).data( "foo" ) );
alert( $( "body" ).data() );

上面的行弹出了设置在body元素上的数据值的警告框。如果那个元素上根本没有设置数据,就会返回undefined

1
2
3
alert( $( "body" ).data( "foo" ) ); // undefined
$( "body" ).data( "bar", "foobar" );
alert( $( "body" ).data( "bar" ) ); // foobar

jQuery 3改变了此方法的行为,把它对齐到Dataset API specifications。具体来说,jQuery 3把“-”(U+002D)的每个二字符序列转换成一个小写ASCII字母后面跟着字母的大写版本,遵照the algorithm of the Dataset API的定义。编写$( "body" ).data( { "my-name": "aValue" } ).data();将返回{ myName: "aValue" }

HTML5 data-* Attributes

自从jQuery 1.4.3以来,HTML 5 data- attributes将被自动推到jQuery的data对象。根据W3C HTML5 specification,带有嵌入的短横的特性的对待方式,在jQuery 1.6中已经做了改变。

例如,给定下面的HTML:

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

下面所有的jQuery代码都是能起作用的。

1
2
3
4
$( "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.000”都等于一个数字(数值为100),但是转换它们将改变它们的表达式,所以它们被留作字符串。字符串值“100”会被转换成数字100。

当数据特性是一个对象时(用“{”开头)或是一个数组时(用“[”开头),则会使用jQuery.parseJSON,以解析字符串;它必须遵守valid JSON syntax包括引起来的属性名称。如果值不可解析为一个JavaScript值,它会被留作字符串。

若要将此值的特性检索为字符串,而不作任何转换它的尝试,请使用attr()方法。

第一次访问此数据属性,推加data-特性,然后不再访问或修改(然后所有的数据值都在jQuery中内部存储)。

不带参数地调用.data()将把所有的值检索为一个JavaScript对象。此对象可以在一个变量中安全地缓存,直到用.data(obj)方法设置一个新对象。直接使用对象来取得或设置值比制作对.data()的单独调用来取得或设置每个值更快速。

1
2
3
4
5
var mydata = $( "#mydiv" ).data();
if ( mydata.count < 9 ) {
mydata.count = 43;
mydata.status = "embiggened";
}

补充说明:

  • 注意,此方法当前并不提供跨平台支持,以在XML文档上设置数据,因为Internet Explorer 并不允许通过expando属性来附加数据。

示例:

取得针对一个元素存储,命名为“blah”的数据。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
<!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>

演示: