最近,我正在使用的应用程序从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>

在1.7.1和1.8.3中,所有结果均为undefined
在1.9.1和1.10.2中,将.data("blah")undefined切换为null的空选择器的结果。

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

我提供了一个小提琴,以显示各种版本的jQuery如何处理此问题。

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

最佳答案

不需要这种行为改变,它是(或者说是)一个错误。
区别来自以下几行:

在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;
}

当选择为空,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;
}

当选择为空,elem被评估为假,则返回null
这不是故意的,实际上是十一月份应用的this commit修复的。使用jquery-1.11.0运行代码具有原始行为:返回undefined

07-28 02:39
查看更多