带有片段的jQuery .data()

时间:2015-12-23 20:55:40

标签: javascript jquery

在这个jsFiddle中:https://jsfiddle.net/cu99jyc2/

请注意,在片段上设置.data()后,它可以将其读回。另请注意,jQuery版本是1.9.0

现在,如果您将jQuery版本更改为1.9.1,则会失败:https://jsfiddle.net/cu99jyc2/1/

这是为什么?它实际上是旧jQuery中的一个错误吗?如果是这样,究竟是什么错误?您允许/不允许在.data()上设置哪些节点?

2 个答案:

答案 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;
        }

您将访问数据。

请参阅:https://jsfiddle.net/gjom6trg/1/

答案 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

示例:https://jsfiddle.net/DinoMyte/cu99jyc2/3/