【问题标题】:Is there a way to do a 'scoped' add() in jQuery?有没有办法在 jQuery 中执行“作用域”add()?
【发布时间】:2010-09-26 02:53:19
【问题描述】:

主 jQuery 方法采用第二个可选参数来为搜索提供上下文。 例如

$(".setA", ancestorOfSetsA);

然而,jQuery add() 方法不接受这个上下文参数。我想要完成的是:

$(".setA", ancestorOfSetsA).add(".setB", ancestorOfSetsB);

我正在尝试通过一个插件来重载add() 方法,但我不知道如何将两个 jQuery 对象组合成一个 jQuery 对象。

我想找到一种方法来使用 jQuery 执行作用域 add(),但是如果我能找到一种方法来合并到 jQuery 对象,我会自己写一个。

【问题讨论】:

    标签: javascript jquery


    【解决方案1】:

    您可以将 jQuery 集合传递到 add 以及选择器字符串:

    $(".setA", ancestorOfSetsA).add( $(".setB", ancestorOfSetsB) );
    

    如果你想重载add,那么你需要小心支持它的所有行为。某人(您可能正在使用的插件)可能会这样做:

    $( selector ).add('<div>new element</div>').appendTo( somethere );
    

    更新:

    这里是来自 jQuery 的当前添加函数,修改为采用上下文参数:

    jQuery.fn.add = function( selector, context ) {
        return this.pushStack( jQuery.unique( jQuery.merge(
            this.get(),
            typeof selector == 'string' ?
                jQuery( selector, context ) :
                jQuery.makeArray( selector )
        )));
    }
    

    【讨论】:

    • 根据您的 cmets,这是我想出的: $.fn._add = $.fn.add; $.fn.add = function(selector, context){ return this._add(context? $(selector, context): selector ); };想法?
    • 我已经修改了我的插件以不污染 $.fn 命名空间: var add = $.fn.add; $.fn.add = function(selector, context){ return add.call(this, $(selector, context)); };我喜欢这种方法,因为如果 jQuery.add() 发生变化,它就不需要更新。
    最近更新 更多