序言
这个问题涉及使用HTML的data
属性创建HTML元素,比如<object data="foo"></object>
。
问题
我刚刚偶然发现一个问题,如果我写下以下代码:
$('<div>', { id:"foo", 'class':"bar" });
// <div id="foo" class="bar"></div>
然而
$('<object>', { id:"foo", data:"some+data+string" });
// [ <object id="foo"></object> ]
我期望输出的结果是
// [ <object id="foo" data="some+data+string"></object> ]
我知道.data
是什么。我的问题是
$('<object>', { id:"foo", data:"some+data+string" }).data();
// Object {}
$('<object>', { id:"foo", 'data-foo':"some+data+string" }).data();
// Object {foo:"some+data+string"}
那么……为什么它没有创建HTML属性data
呢?既然不是data-xxxx
属性名称,因此不会创建任何实际数据。
更新
我再次重申这个问题中所写的内容。
[...] 如果我写
$('<div>', { id:"foo", 'class':"bar" });
// <div id="foo" class="bar"></div>
然而
$('<object>', { id:"foo", data:"some+data+string" });
// [ <object id="foo"></object> ]
我期望输出的地方
// [ <object id="foo" data="some+data+string"></object> ]
......而且,我知道.data
的用法。
为什么$('<div>', { data: 'foo' })
创建的不是<div data="foo"></div>
,或者换句话说,为什么它在创建元素时完全忽略了这个属性?
编辑
对于那些认为data
不是有效HTML属性的人,可以看看这里。
更新
截至今天,我用于此用例的解决方案是
$('<div>', {
attr: {
data: 'foo'
}
});
data-foo
,而不是data
。仅仅因为jQuery的data()
函数将数据属性的第二部分作为参数并不意味着它在其他任何地方都能这样工作。 - adeneoon()
和css()
的原因,像这样,data()
也是一个方法,它只在内部设置数据,并且jQuery在使用键作为属性之前必须查找方法,因为一旦属性被设置,就为时已晚了,如果键匹配方法,则不设置属性。 - adeneo