当使用data-someAttribute时,$.data和$.attr的用法有什么不同?
data-someAttribute
$.data
$.attr
我的理解是,$.data存储在jQuery的$.cache中,而不是DOM中。因此,如果我想使用$.cache进行数据存储,我应该使用$.data。如果我想添加HTML5数据属性,我应该使用$.attr("data-attribute", "myCoolValue")。
$.cache
$.attr("data-attribute", "myCoolValue")
如果你将数据从服务器传递给DOM元素,你应该在元素上设置数据:
<a id="foo" data-foo="bar" href="#">foo!</a>
然后可以使用jQuery中的.data()来访问数据:
.data()
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
此外,数据属性的命名约定有一个隐藏的“陷阱”:
<a id="bar" data-foo-bar-baz="fizz-buzz" href="#">fizz buzz!</a>
console.log( $('#bar').data('fooBarBaz') ); //outputs "fizz-buzz" as hyphens are automatically camelCase'd
连字符键仍然有效:
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>和应该被视为相同的,但为了最好的兼容性,小写形式应该是首选的。
<div data-foobar></div>
<DIV DATA-FOOBAR></DIV>
<dIv DaTa-FoObAr></DiV>
如果值与识别的模式匹配,.data()方法还将执行一些基本的自动强制转换:
<a id="foo" href="#" data-str="bar" data-bool="true" data-num="15" data-json='{"fizz":["buzz"]}'>foo!</a>
$('#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():
.attr()
<a id="foo" href="#" data-color="ABC123"></a> <a id="bar" href="#" data-color="654321"></a>
$('#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版本中被错误地解析,并且在jQuery 1.8 rc 1中不再被解析为Number。
Number
# EYZ2。在此之前,任何Number的有效表示格式都将转换为Number。现在,数值型值只有在表示保持不变时才会自动强制转换。用一个例子最好地说明了这一点。
<a id="foo" href="#" data-int="1000" data-decimal="1000.00" data-scientific="1e3" data-hex="0x03e8">foo!</a>
// 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,例如使用一元的+操作符。
+
+$('#foo').data('hex'); // 1000
两者之间的主要区别是存储在哪里以及如何访问它。
$.fn.attr将信息直接存储在元素的属性中,这些属性在检查时是公开可见的,也可以从元素的原生API中获得。
$.fn.attr
$.fn.data将信息存储在可笑的模糊位置。它位于一个名为data_user的封闭局部变量中,该变量是一个局部定义函数Data的实例。这个变量不能从jQuery外部直接访问。
$.fn.data
data_user
使用attr()的数据集
attr()
$(element).attr('data-name')
element.getAttribute('data-name')
data-name
$(element).data(name)
element.dataset['name']
element.dataset.name
使用.data()的数据集
.data(name)
您可以使用data-*属性来嵌入自定义数据。data-*属性使我们能够在所有HTML元素中嵌入自定义数据属性。
data-*
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");