jQuery 数据与 Attr?

IT技术 javascript jquery html custom-data-attribute
2021-01-26 20:55:42

使用$.data$.attr使用时的用法有什么区别data-someAttribute

我的理解是它$.data存储在 jQuery 中$.cache,而不是 DOM 中。因此,如果我想$.cache用于数据存储,我应该使用$.data. 如果我想添加 HTML5 数据属性,我应该使用$.attr("data-attribute", "myCoolValue").

3个回答

如果您要从服务器向 DOM 元素传递数据,则应在该元素上设置数据:

<a id="foo" data-foo="bar" href="#">foo!</a>

然后可以使用.data()jQuery访问数据

console.log( $('#foo').data('foo') );
//outputs "bar"

但是,当您使用数据在 jQuery 中的 DOM 节点上存储数据时,变量将存储在节点对象上这是为了容纳复杂的对象和引用,因为将数据存储在节点元素上作为属性将仅容纳字符串值。

继续我上面的例子:
$('#foo').data('foo', 'baz');

console.log( $('#foo').attr('data-foo') );
//outputs "bar" as the attribute was never changed

console.log( $('#foo').data('foo') );
//outputs "baz" as the value has been updated on the object

此外,数据属性的命名约定有一些隐藏的“陷阱”:

HTML:
<a id="bar" data-foo-bar-baz="fizz-buzz" href="#">fizz buzz!</a>
JS:
console.log( $('#bar').data('fooBarBaz') );
//outputs "fizz-buzz" as hyphens are automatically camelCase'd

带连字符的键仍然有效:

HTML:
<a id="bar" data-foo-bar-baz="fizz-buzz" href="#">fizz buzz!</a>
JS:
console.log( $('#bar').data('foo-bar-baz') );
//still outputs "fizz-buzz"

但是,返回的对象.data()不会设置带连字符的键:

$('#bar').data().fooBarBaz; //works
$('#bar').data()['fooBarBaz']; //works
$('#bar').data()['foo-bar-baz']; //does not work

正是出于这个原因,我建议避免在 javascript 中使用带连字符的键。

对于 HTML,请继续使用带连字符的形式。HTML属性应该得到ASCII-小写自动,所以<div data-foobar></div><DIV DATA-FOOBAR></DIV><dIv DaTa-FoObAr></DiV>认为被视为是相同的,但最好的相容性下壳体形式应是优选的。

.data()如果值与识别的模式匹配,方法还将执行一些基本的自动转换:

HTML:
<a id="foo"
    href="#"
    data-str="bar"
    data-bool="true"
    data-num="15"
    data-json='{"fizz":["buzz"]}'>foo!</a>
JS:
$('#foo').data('str');  //`"bar"`
$('#foo').data('bool'); //`true`
$('#foo').data('num');  //`15`
$('#foo').data('json'); //`{fizz:['buzz']}`

这种自动投射能力对于实例化小部件和插件非常方便:

$('.widget').each(function () {
    $(this).widget($(this).data());
    //-or-
    $(this).widget($(this).data('widget'));
});

如果您绝对必须将原始值作为字符串,那么您需要使用.attr()

HTML:
<a id="foo" href="#" data-color="ABC123"></a>
<a id="bar" href="#" data-color="654321"></a>
JS:
$('#foo').data('color').length; //6
$('#bar').data('color').length; //undefined, length isn't a property of numbers

$('#foo').attr('data-color').length; //6
$('#bar').attr('data-color').length; //6

这是一个人为的例子。为了存储颜色值,我曾经使用数字十六进制表示法(即 0xABC123),但值得注意的是,十六进制在 1.7.2 之前的 jQuery 版本中被错误解析,并且不再被解析为NumberjQuery 1.8 rc 1。

jQuery 1.8 rc 1 改变了 auto-casting 的行为以前,任何有效表示 a 的格式都Number将被强制转换为Number. 现在,数字值只有在它们的表示保持不变时才会自动转换。这最好用一个例子来说明。

HTML:
<a id="foo"
    href="#"
    data-int="1000"
    data-decimal="1000.00"
    data-scientific="1e3"
    data-hex="0x03e8">foo!</a>
JS:
                              // pre 1.8    post 1.8
$('#foo').data('int');        //    1000        1000
$('#foo').data('decimal');    //    1000   "1000.00"
$('#foo').data('scientific'); //    1000       "1e3"
$('#foo').data('hex');        //    1000     "0x03e8"

如果您计划使用替代的数字语法来访问数字值,请确保将值强制转换为Number第一个,例如使用一元运算+符。

JS(续):
+$('#foo').data('hex'); // 1000
我喜欢,foo,bar,baz,嘶嘶声,嗡嗡声更多:D
2021-03-15 20:55:42
@SableFoste,哪个链接?api.jquery.com/data是该方法的正确链接,据我所知没有改变。
2021-03-24 20:55:42
好的,现在我明白你的意思了。不知道那个小细节,感谢更新:)
2021-03-28 20:55:42
@vitorbal,虽然这是事实,通过返回的对象.data()不会有连字符的形式设置,所以$('#bar').data('foo-bar-baz')会工作,但$('#bar').data()['foo-bar-baz']不会。正是出于这个原因,我建议人们避免使用带连字符的形式。
2021-03-29 20:55:42
喜欢每一行。
2021-04-06 20:55:42

两者之间的主要区别在于它的存储位置和访问方式。

$.fn.attr 将信息直接存储在元素上的属性中,这些属性在检查时公开可见,也可从元素的本机 API 获得。

$.fn.data将信息存储在一个可笑的晦涩的地方。它位于一个称为封闭的局部变量中data_user,该变量是本地定义的函数 Data 的一个实例。这个变量不能直接从 jQuery 外部访问。

数据集 attr()

  • 可从 $(element).attr('data-name')
  • 可从element.getAttribute('data-name'),
  • 如果值的形式data-name也可以从$(element).data(name)element.dataset['name']element.dataset.name
  • 检查时在元素上可见
  • 不能是对象

数据集 .data()

  • 访问.data(name)
  • 无法从.attr()其他任何地方访问
  • 检查时在元素上不公开可见
  • 可以是对象
也是.attr()要走的路,如果之后你想使用数据作为选择器(.data()将找不到;请参阅codepen.io/anon/pen/EvawPV?editors=1011
2021-03-19 20:55:42
是的,我的主要问题是这些数据的存储位置,所以感谢您提供这些信息!
2021-03-27 20:55:42

您可以使用data-*属性来嵌入自定义数据。这些data-*属性使我们能够在所有 HTML 元素上嵌入自定义数据属性。

jQuery.data()方法允许您以一种安全的方式获取/设置任何类型的数据到 DOM 元素,这种方式不会受到循环引用的影响,因此不会出现内存泄漏。

jQuery.attr()方法仅获取/设置匹配集中第一个元素的属性值。

例子:

<span id="test" title="foo" data-kind="primary">foo</span>

$("#test").attr("title");
$("#test").attr("data-kind");
$("#test").data("kind");
$("#test").data("value", "bar");