【问题标题】:What changed in jQuery 1.9.1 to cause the .data extension method to return null instead of undefined when a selector returns no results?What changed in jQuery 1.9.1 to cause the .data extension method to return null instead of undefined when a selector returns no results?
【发布时间】:2014-01-24 21:13:02
【问题描述】:

最近我工作的应用程序从 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/

【问题讨论】:

  • 很抱歉你是对的。我包含了错误版本的小提琴。马上更新。
  • 在尝试跟踪此提交时,可能有助于查看 github 上的 this file 以了解 2012 年 11 月 13 日至 2013 年 1 月 15 日之间的更改 (source)

标签: javascript jquery


【解决方案1】:

这种行为改变不是我们想要的,它是(或者更确切地说:它是)一个错误。 区别来自以下几行:

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

When the selector is empty, data is returned and at this point data is undefined.

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

When the selector is empty, elem is evaluated to false and null is returned. 这不是故意的,实际上是由 11 月申请的 this commit 修复的。使用 jquery-1.11.0 运行代码具有原始行为:返回 undefined

【讨论】:

  • 谢谢!查看确切的代码位真的很有帮助。我做了更多的研究,看起来好像这是一个错误,它已被修复,然后可能被恢复或从未真正修复 (bugs.jquery.com/ticket/13785)。我看到了单元测试,所以我对修复很有信心。
  • 没错,我也对历史感到有些困惑。修复可能在某些合并中无意中丢失并稍后重新完成。
猜你喜欢
  • 2022-12-01
  • 2011-09-22
  • 2022-12-02
  • 1970-01-01
  • 2022-12-27
  • 2022-12-27
  • 2022-12-02
  • 1970-01-01
  • 2022-12-02
相关资源
最近更新 更多