为了账号安全,请及时绑定邮箱和手机立即绑定

jQuery Data vs Attr?

jQuery Data vs Attr?

芜湖不芜 2019-05-29 15:40:40
jQuery Data vs Attr?使用之间$.data和$.attr使用时的使用data-someAttribute有何不同?我的理解是$.data存储在jQuery中$.cache,而不是DOM中。因此,如果我想$.cache用于数据存储,我应该使用$.data。如果我想添加HTML5数据属性,我应该使用$.attr("data-attribute", "myCoolValue")。
查看完整描述

3 回答

?
蛊毒传说

TA贡献1895条经验 获得超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
 changedconsole.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改变了自动转换的行为。之前,任何有效表示的格式都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


查看完整回答
反对 回复 2019-05-29
?
胡说叔叔

TA贡献1804条经验 获得超8个赞

您可以使用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");


查看完整回答
反对 回复 2019-05-29
  • 3 回答
  • 0 关注
  • 494 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信