jQuery add()函数和jQuery对象的上下文

给出以下 HTML示例…
<div id='div1'>div one</div>
<div id='div2'>div two</div>

…我发现以下jQuery代码

$('#div1').click(function() {

    var $d = $(this);    // Using 'this' instead of '#div1'

    $d.add('#div2').remove();
});

…不会将#div2添加到$d引用的集合,但是这个代码

$('#div1').click(function() {

    var $d = $('#div1');    // Using '#div1' instead of 'this'

    $d.add('#div2').remove();
});

…成功添加#div2.

查询firebug时,我发现使用$(this)给了jQuery对象一个#div1的上下文,但是做$(‘#div1’)给对象一个文档的上下文.

鉴于这些信息我试过…

var $d = $(this,document);

…和add()函数按预期工作.

所以这里的问题.有人可以向我解释为什么在使用$(this)vs $(‘#div1’)时分配了不同的上下文?

解决方法

编辑以更好地解决您的问题:
First,look at the relevant code here,这是jQuery如何处理$()调用.当你传递一个DOM元素(这就是它自己的div)时,上下文是DOM元素本身,这样可以更好地处理文档片段等.当你传递一个字符串时,默认上下文是document(因为它是顶级祖先搜索).记住一个$(选择器,上下文)实际上是在封面下调用context.find(selector),所以如果没有指定的话,开始文档是有意义的.

注意:您可以随时检查上下文,它是一个可用的属性,如下所示:$(this).context

对于.add()行为:
.add()使用相同的上下文来选择要添加的jQuery元素,所以你看到的是预期的行为.为了更好的描述,see how .add() is written

add: function( selector,context ) {
    var set = typeof selector === "string" ?
                jQuery( selector,context || this.context ) :
                jQuery.makeArray( selector ),all = jQuery.merge( this.get(),set );

    return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ?
            all :
            jQuery.unique( all ) );
    }

注意如果没有通过,它将如何使用当前上下文.为了覆盖这一点,它接受一个上下文,您可以通过这个上下文传递文档并获得所需的结果,如下所示:

$('#div1').click(function() {
   $(this).add('#div2',document).remove();
});

相关文章

jQuery插件的种类 1、封装对象方法 这种插件是将对象方法封装起来,用于对通过选择器获取的jQuery对象进...
扩展jQuery插件和方法的作用是非常强大的,它可以节省大量开发时间。 入门 编写一个jQuery插件开始于给...
最近项目中需要实现3D图片层叠旋转木马切换的效果,于是用到了jquery.roundabout.js。 兼容性如图: ht...
一、什么是deferred对象? 开发网站的过程中,我们经常遇到某些耗时很长的javascript操作。其中,既有异...
AMD 模块 AMD(异步模块定义,Asynchronous Module Definition)格式总体的目标是为现在的开发者提供一...