最近,我正在使用的应用程序从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
返回,在这一点上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;
}
当选择为空,
elem
被评估为假,则返回null
。这不是故意的,实际上是十一月份应用的this commit修复的。使用jquery-1.11.0运行代码具有原始行为:返回
undefined
。