错误.MAP()时,回调函数返回一个jQuery对象

问题描述:

http://jsfiddle.net/mblase75/NfzbA/ - 在JavaScript控制台中使用jQuery 1.9.1错误.MAP()时,回调函数返回一个jQuery对象

var $opts = $('.plant-page').map(function (i, el) { 
    return $('<option>'); 
}).appendTo('#change-page select'); 

错误说:Uncaught TypeError: Cannot read property 'ownerDocument' of undefined

当我切换到jQuery的1.8。 3,结果如预期 - 选项元素附加到选择:http://jsfiddle.net/mblase75/NfzbA/2/

我做错了什么?

在jQuery的1.9.1,如果我重写.map()回调函数返回一个DOMElement,而不是一个jQuery对象,它按预期工作:http://jsfiddle.net/mblase75/NfzbA/3/

var $opts = $('.plant-page').map(function (i, el) { 
    return $('<option>').text(this.id)[0]; 
}).appendTo('#change-page select'); 

当我提出这是一个jQuery的bug(http://bugs.jquery.com/ticket/13567 ),有人告诉我:

分辨率设置为notabug

您正在尝试添加jQuery对象内的jQuery对象 ,因为您通过$.fn.map()将jQuery对象 插入到所述jQuery对象中。这不支持,但 足够明显。我们通常不会列出所有 不能包含在jQuery集合中的所有内容,因为存在无限的 列表。你的重写看起来更好。

所以:即使这在jQuery 1.8中工作,它被认为是预期的行为而不是错误的回报。 .map()回调应始终返回DOMelements而不是jQuery对象。

+0

我同意在错误报告中的评估。所有jQuery迭代方法都以这种方式工作。在回调方法内部,'this'是一个DOM节点,而不是一个jQuery对象,返回的值应该是相同的形式。 '$([$(),$(),$()])'也不再适用于过去。 – 2013-03-05 16:12:01

+0

@KevinB我同意 - 但是再次,'$($ some-jQuery-object)'仍然返回一个有效的jQuery对象! – Blazemonger 2013-03-05 17:02:48