我有一个特殊的JavaScript函数,可以接受jQuery选择器,普通对象或jQuery对象。在任何一种情况下,函数的参数总是传递给jQuery。
function foo(selector)
{
var i = 0;
var items = new Array();
$(selector).find('.myClass').each(function()
{
items[i] = $(this).val();
i++;
}
return items;
}
该函数在jQuery 1.8中按预期工作,但在jQuery 1.12+中不起作用(它从不进入.each)。这种代码风格存在于我正在使用的代码库中的许多地方(1880行匹配.find)。
根据jQuery网站,当jQuery对象传递给jQuery函数时,将返回该jQuery对象的克隆。我期望在功能上获得相同的对象,但使用find时不是这种情况。 Find似乎期望原始jQuery对象或克隆对象的第0个元素ex:$(“div”)。find(“。myclass”)和$($(“div”))[0] .find (“.myclass”)工作,但$($(“div”))。find(“。myclass”)没有。
我提出的最简单的解决方案是包装jQuery函数来处理它,使它立即返回传入的任何jQuery对象,而不是尝试jQuery的克隆:
(jQuery.fn.init = (function (init) {
return function (selector) {
if (selector instanceof jQuery) {
return selector;
}
return init.apply(this, arguments);
};
})(jQuery.fn.init)).prototype = jQuery.fn;
这很好用,但是有什么“陷阱”我应该担心吗?我是否有理由要求克隆的jQuery对象而不是对原始对象的引用?
答案 0 :(得分:0)
我不认为返回一个克隆,它应该返回包含指针的对象。 您的第一个代码应该只使用一个小的更改。 这是我如何写它的一个例子。
function foo(selector)
{
var i = 0; // no needed, use .push() instead
var items = new Array();
$(selector).each(function(){ // loop throw each object
$(this).find('.myClass').each(function() // now try to find myClass, $(this) will always contain only one object
{
items.push($(this).val());
}
});
return items;
}

答案 1 :(得分:0)
虽然没有人可以在没有完整源代码的情况下知道这一点,但在错误发生之前函数中有一个语句:
var selector = contentContainer.find("[TabId='EditProp']");
if (selector.length = 1 && selector.attr('PanelStatus') != '' && selector.attr('PanelStatus') != 'NewProp')
{
propEditObj.PropNameData = foo($(selector));
}
这是jQuery对象上的selector.length属性的赋值(selector = 1而不是selector == 1),这在jQuery 1.8.3中是可以接受的,但在1.12.4 +中引起了奇怪的破坏。