Javascript 当选择器不返回任何结果时,jQuery1.9.1中的哪些更改导致.data扩展方法返回null而不是undefined?
最近,我开发的应用程序从jQuery 1.7.1升级到了1.10.2,其中包括了Migrate 1.2.1 升级后,我们注意到jQuery为扩展方法Javascript 当选择器不返回任何结果时,jQuery1.9.1中的哪些更改导致.data扩展方法返回null而不是undefined?,javascript,jquery,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="r
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>
试图从不返回结果的选择器中访问.data成员
$(函数(){
var目标=$(“#结果”);
target.append(“jQuery”+$.fn.jQuery+”=>“+$(“p”).data(“blah”)+”;
target.append(“jQuery”+$.fn.jQuery+”=>“+$(“p”).attr(“数据blah”)+”;
target.append(“jQuery”+$.fn.jQuery+”=>“+$(“body”).data(“blah”)+”;
target.append(“jQuery”+$.fn.jQuery+”=>“+$(“body”).attr(“数据blah”)+”;
});
在1.7.1和1.8.3中,所有结果均未定义
。
在1.9.1和1.10.2中,带有.data(“blah”)
的空选择器的结果从未定义的切换到null
我已经查看了1.9.0升级文档以及1.10.0发行说明,没有发现任何关于这些更改的迹象。有人知道这是为什么吗?是故意的吗
我已经包括了一个提琴来展示jQuery的各种版本是如何处理这个问题的
这种行为的改变不是我们想要的,而是(或者说:它是)一个bug。
区别来自以下几行:
在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;
}
当选择器为空时,返回数据
,此时数据
为未定义
但是在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
计算为false,并返回null
。
这并不是有意的,而是在11月由applied公司实际修复的。使用jquery-1.11.0运行代码具有原始行为:undefined
返回。很抱歉,您是正确的。我把小提琴的版本弄错了。现在更新。在尝试跟踪此提交过程中,查看2012年11月13日至2013年1月15日期间github上的更改可能会有所帮助()谢谢!查看代码的精确部分非常有帮助。我做了更多的研究,看起来好像这是一个bug,它被修复了,然后可能恢复或从未真正修复()。我看到了单元测试,所以我对修复有信心。没错,我对历史也有点困惑。修复程序可能在某些合并过程中意外丢失,并在以后重新执行。