#20:数据!data-*!.data()!.attr(data-*)!

数据。在 jQuery 的世界里,它指的是直接附加到元素上的信息片段(而不是,比如说,只负责自身的一个变量)。有很多方法可以在“客户端”(在浏览器中,而不是服务器)保存数据片段。可以使用任何类型的变量、cookie、localStorage、indexDB,以及其他各种方法。当数据与特定元素特别相关时,就会使用数据。

像许多 jQuery 方法一样,它既有设置器(两个参数)

$("#thing").data("name", "value");

也有获取器(一个参数)

$("#thing").data("name");
// "value"

你可以在任何 jQuery 对象上使用它。如果该对象中有多个元素,当你将其用作设置器时,所有元素都会获得该数据值。如果当你将其用作获取器时,该对象中有多个元素,它将使用第一个元素。

可以将数据视为元素的一种命名空间。许多元素可以使用相同的数据“名称”,但具有不同的值。

在 CSS-Tricks 的一个旧演示中有一个真实的用例,即Google Maps 滑块。在该演示中,有一个位置列表和一个嵌入式 Google 地图。当你在位置上悬停时,地图会移动到该位置的中心。为了做到这一点,地图 API 需要坐标。将这些数据放在这些位置的 HTML 中是有意义的,但我们不需要看到它。这是 HTML 中data-* 属性(HTML5 中新增)的完美用例。然后,该位置列表中的列表项可能如下所示

<li data-geo-lat="41.9786" data-geo-long="-87.9047">
  <h3>O'Hare Airport</h3>
  <p>Flights n' stuff</p>
  <p class="longdesc"><strong>About:</strong> Info about location...</p>
</li>

data-* 只是表示data-任何内容的一种方式。你可以随意创建数据属性。任何你想要的。在本例中,我们为纬度创建了一个,为经度创建了另一个。当鼠标悬停事件在该列表项上触发时,我们只需使用 jQuery 的 .data() 获取器来获取信息并将其与 API 一起使用。

因此,我们现在已经从两个方面了解了数据,即从 JavaScript 本身设置和获取的数据,以及在 HTML 中开始并由 JavaScript 使用的数据。两者都可以,API 也是相同的。你可能会认为使用 .data() 作为 data-* 属性中信息的获取器很奇怪。它确实有点奇怪。通常,你像这样访问 HTML 中属性的信息

$("#thing").attr("rel"); // or any other attribute

如果你愿意,也可以这样使用它

$("#thing").attr("data-geo-lat");

.data() 获取器只是一个快捷方式。我有点喜欢它,因为它能让你保持正确的思维方式。

但是,需要注意的是,使用 .data() 作为设置器**不会实际更改 HTML 中的data-* 属性**。这是一个很好的默认设置,因为不更改 DOM 意味着速度更快。如果你绝对需要更改 HTML 中的属性,请使用 .attr() 方法作为设置器。还要注意,使用 .attr() 时,你需要包含“data-”前缀,而使用 .data() 时则不需要。

$("#thing").attr("data-name", "Chris");

你可能需要这样做,以便确保应用程序的其他部分可以访问它,或者如果你正在执行类似的操作,例如针对它们编写 CSS 选择器(例如 [data-something="whatever"] { }