在这个jsFiddle中:https://jsfiddle.net/cu99jyc2/
请注意,在片段上设置.data()
后,它可以将其读回。另请注意,jQuery版本是1.9.0
现在,如果您将jQuery版本更改为1.9.1,则会失败:https://jsfiddle.net/cu99jyc2/1/
这是为什么?它实际上是旧jQuery中的一个错误吗?如果是这样,究竟是什么错误?您允许/不允许在.data()
上设置哪些节点?
答案 0 :(得分:1)
导致行为差异的更改是在acceptData方法中。如果你看一下jQuery代码,你会看到这个评论:
//不要在非元素上设置数据,因为它不会被清除 (#8335)。
在此处查看门票:https://bugs.jquery.com/ticket/8335
因此他们改变了验证方式,因此它只接受元素,而片段不是元素。如果你在acceptData方法中从1.9.1改变这一行,请看这里,它验证是否应该允许设置数据:
if ( elem.nodeType && elem.nodeType !== 1 && elem.nodeType !== 9 ) {
return false;
}
为:
if ( elem.nodeType && elem.nodeType !== 1 && elem.nodeType !== 9 && elem.nodeType !== 11) {
return false;
}
您将访问数据。
答案 1 :(得分:0)
我认为问题是如何通过data
创建的元素访问createDocumentFragment()
attr。在1.8.3
之前,您可以灵活地在通过data
创建的节点对象上创建createDocumentFragment()
个对象,但在过渡到1.9.1
期间,此功能仅限于{{1} (以避免内存泄漏)。
可以在以下示例中看到其效果:
jquery 1.8.3 - >
DOM elements
示例:https://jsfiddle.net/DinoMyte/cu99jyc2/2/
jquery 1.9.1 - >
var $frag = $(document.createDocumentFragment());
$frag.data('foo', {'bar': 'baz'});
$('div').text($.type($frag.data('foo'))); // returns an object