jQuery .data()与片段

7
在这个jsFiddle中: https://jsfiddle.net/cu99jyc2/ 请注意,在对片段设置后,它可以读取回来。同时,请注意jQuery版本为1.9.0。
现在,如果您将jQuery版本更改为1.9.1,则会失败:https://jsfiddle.net/cu99jyc2/1/ 为什么会这样?这实际上是旧版jQuery的一个错误吗?如果是,那么具体是哪个错误?有哪些节点允许/不允许设置
2个回答

1
引起行为差异的更改在acceptData方法中。如果您查看jQuery代码,您会看到这个注释:
//不要在非元素上设置数据,因为它不会被清除(#8335)。
请参见此处的票证: https://bugs.jquery.com/ticket/8335 所以他们改变了验证方式,只接受元素,而片段不是元素。如果您从1.9.1更改此行,请参见此处的acceptData方法,该方法验证是否允许设置数据。
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/

0

我认为问题在于如何访问通过createDocumentFragment()创建的元素上的data属性。在1.8.3之前,您可以对通过createDocumentFragment()创建的节点对象创建data对象,但在转换到1.9.1时,为了避免内存泄漏,此功能仅限于DOM元素

以下示例中可以看到其影响:

jquery 1.8.3 ->

var $frag = $(document.createDocumentFragment());
$frag.data('foo', {'bar': 'baz'});
$('div').text($.type($frag.data('foo'))); // returns an object

示例: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 undefined.

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


我猜我的问题是 - 这与jQuery的哪个更改相关?我甚至没有看到1.9.1中提到.data的任何内容,也没有看到与之相关的任何内容在1.9.0中。 - Dan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接