使用find与克隆的jQuery对象?

时间:2017-04-20 19:55:09

标签: jquery

我有一个特殊的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对象而不是对原始对象的引用?

2 个答案:

答案 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 +中引起了奇怪的破坏。