在jQuery 1.9.1中有什么变化导致.data扩展方法在选择器没有返回结果时返回null而不是undefined?

Sam*_*m R 9 javascript jquery

最近我使用的应用程序从jQuery 1.7.1升级到1.10.2,其中包含Migrate 1.2.1.

升级后,我们注意到jQuery为扩展方法返回了不同的结果,data具体取决于选择器是否有任何结果.该attr扩展方法总是返回undefined无论选择的结果.

使用以下HTML文档,我使用版本1.7.1,1.8.3,1.9.1和1.10.2运行测试.

<html>
<head></head>
<body>

    <div id="results">trying to access .data member off a selector that returns no results</div>

    <script type="text/javascript" src="jQuery.js"></script>
    <script type="text/javascript">
        $(function(){
            var target = $("#results");
            target.append("<div>jQuery " + $.fn.jquery + " => " + $("p").data("blah") + "</div>");
            target.append("<div>jQuery " + $.fn.jquery + " => " + $("p").attr("data-blah") + "</div>");

            target.append("<div>jQuery " + $.fn.jquery + " => " + $("body").data("blah") + "</div>");
            target.append("<div>jQuery " + $.fn.jquery + " => " + $("body").attr("data-blah") + "</div>");
        });
    </script>
</body>
Run Code Online (Sandbox Code Playgroud)

在1.7.1和1.8.3中,所有结果都是undefined.在1.9.1和1.10.2结果中,空选择器.data("blah")从切换undefinednull.

我已经查看了1.9.0升级文档以及1.10.0发行说明,但没有找到任何有关这些更改的说明.有人知道为什么吗?这是故意的吗?

我已经包含了一个小提琴来展示各种版本的jQuery如何处理这个问题.

http://jsfiddle.net/T5L6Y/6/

Dji*_*eus 3

这种行为改变并不是我们想要的,它是(或者更确切地说:它曾经是)一个错误。差异来自于这些行:

在 jquery-1.8.3.js 中:1772

if (value === undefined) {
    data = this.triggerHandler("getData" + part, [parts[0]]);

    // Try to fetch any internally stored data first
    if (data === undefined && elem) {
        data = jQuery.data(elem, key);
        data = dataAttr(elem, key, data);
    }

    return data === undefined && parts[1] ? 
    this.data(parts[0]) : 
    data;
}
Run Code Online (Sandbox Code Playgroud)

当选择器为空时,data返回 ,此时dataundefined

但在 jquery-1.9.1.js:1824

if (value === undefined) {
    // Try to fetch any internally stored data first
    return elem ? dataAttr(elem, key, jQuery.data(elem, key)) : null;
}
Run Code Online (Sandbox Code Playgroud)

当选择器为空时,elem计算结果为 false 并null返回。这并不是有意为之的,实际上已通过11 月份应用的提交修复了。使用 jquery-1.11.0 运行代码具有原始行为:undefined返回。