Javascript 在jQuery中标识$(this)

Javascript 在jQuery中标识$(this),javascript,jquery,this,Javascript,Jquery,This,找出jQuery中当前的$(this)等于什么的最佳方法是什么 例如警报(此)没有多大帮助 我问这个问题的原因是,在我将代码移动到函数中之后,一段代码当前没有执行它应该执行的操作 下面的摘录现在在一个函数中,$(this)现在似乎是指DOMWindow if($(this).hasClass('open')) { alert('I should be closed'); $(this).removeClass('open').addClass('closed'); $

找出jQuery中当前的
$(this)
等于什么的最佳方法是什么

例如
警报(此)没有多大帮助

我问这个问题的原因是,在我将代码移动到函数中之后,一段代码当前没有执行它应该执行的操作

下面的摘录现在在一个函数中,$(this)现在似乎是指DOMWindow

if($(this).hasClass('open'))
  {
    alert('I should be closed');
    $(this).removeClass('open').addClass('closed');
    $(this).parents('article').css('border', '1px solid red').animate({'width': '212px'}, 100, "linear", function() {
    run_masonry();
    });
  }
  else
  {
    alert('I should be open');
    $(this).removeClass('closed').addClass('open');
    $(this).parents('article').css('border', '1px solid blue').animate({'width': '646px'}, 100, "linear", function() {
    run_masonry();
  });
}
我如何将其保持为$(this)作为原始单击元素

找出jQuery中当前的
$(this)
等于什么的最佳方法是什么

通过将其记录到您最喜欢的javascript调试工具(例如Chrome developer工具栏)的控制台:

它将返回jQuery包装的对象。如果您想了解有关本机对象的更多信息,可以使用:

console.log(this);
如果您正在进行javascript开发,那么应该使用javascript调试工具<代码>警报
不是这样的工具


既然您已经用一些代码源更新了您的问题,那么您似乎正在全局范围内使用
$(this)
。然后它将引用
窗口
对象。如果希望它引用某个单击的元素或其他内容,则必须首先订阅。单击事件:

$('.someSelector').click(function() {
    // here $(this) will refer to the original element that was clicked.
});
或者,如果您希望在单独的函数中外部化此代码:

function foo() {
    // here $(this) will refer to the original element that was clicked.
}

$('.someSelector').click(foo);
或:


将代码移动到函数中通常会改变代码的范围。因此,“this”将不再指原始对象,而是指新对象(或全局“window”对象)。如果您向我们展示您的代码,我们将能够识别问题。

我怀疑您会这样做:

$('#element').click(function() {
    clickHandler();
});
在这种情况下,将在窗口对象上下文中调用
clickHandler
。要保留正确的上下文,只需将代码更改为:

$('#element').click(clickHandler);

如果您想检查传递的内容,可以使用我的版本或Prinzorn的jquerylog版本。它应该帮助您逐步确定发生了什么:

/

对于类似以下情况的呼叫:

$("#foo").parents(".t1").next().prev().parent().find(".t2:last .t4:last").text("test");
您将得到如下输出(在每个步骤中标识div:

$('#foo'): [<div id="foo" class="t3"></div>]
    parents('.t1'): [ <div class="t1">…</div> ]
        next(undefined): [ <div class="t1">…</div> ]
            prev(undefined): [ <div class="t1">…</div> ]
                parent(undefined): [ <body>…</body> ]
                    find('.t2:last .t4:last'): [<div class="t4">teste</div>]
$('foo'):[]
父母('.t1'):[…]
下一个(未定义):[…]
上一个(未定义):[…]
父项(未定义):[…]
查找('.t2:last.t4:last'):[teste]

是否有办法缩小范围?这会返回大量数据。@CraigWard,是的,使用
控制台.log(this);
只记录本机对象,而不记录
$(this)
@CraigWard您希望缩小范围到什么程度?我希望它是
$(this).attributesThatIWantToSee()
它正在返回DOMWindow,这是100个子对象。这正常吗?@CraigWard那么
这个
很可能是
窗口
,这意味着您在某个地方遇到了函数上下文问题。这听起来像是问题。它正在返回DOMWindow。在函数中有没有办法保持$(这个)?
$("#foo").parents(".t1").next().prev().parent().find(".t2:last .t4:last").text("test");
$('#foo'): [<div id="foo" class="t3"></div>]
    parents('.t1'): [ <div class="t1">…</div> ]
        next(undefined): [ <div class="t1">…</div> ]
            prev(undefined): [ <div class="t1">…</div> ]
                parent(undefined): [ <body>…</body> ]
                    find('.t2:last .t4:last'): [<div class="t4">teste</div>]