最近我使用的应用程序从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")从切换undefined到null.
我已经查看了1.9.0升级文档以及1.10.0发行说明,但没有找到任何有关这些更改的说明.有人知道为什么吗?这是故意的吗?
我已经包含了一个小提琴来展示各种版本的jQuery如何处理这个问题.
这种行为改变并不是我们想要的,它是(或者更确切地说:它曾经是)一个错误。差异来自于这些行:
在 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返回 ,此时data为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;
}
Run Code Online (Sandbox Code Playgroud)
当选择器为空时,elem计算结果为 false 并null返回。这并不是有意为之的,实际上已通过11 月份应用的提交修复了。使用 jquery-1.11.0 运行代码具有原始行为:undefined返回。