Определите $(this) в jQuery

что лучший способ узнать, что $(this) в настоящее время равно в jQuery?

alert(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), являющийся оригинальным элементом щелчка?

4 ответов


что лучший способ узнать, что $(this) в настоящее время равно в jQuery?

, войдя в консоль вашего любимого инструмента отладки javascript (например,Палий или панель инструментов разработчика Chrome, например):

console.log($(this));

который вернет объект, обернутый jQuery. Если вы хотите узнать больше о собственном объекте, вы можете использовать:

console.log(this);

если вы занимаетесь разработкой javascript, вы должны использовать инструмент отладки JavaScript. alert - это не такой инструмент.


теперь, когда вы обновили свой вопрос с некоторым источником кода, кажется, что вы используете $(this) в глобальной области видимости. Тогда это будет относиться к


при перемещении кода в функцию обычно изменяется область действия кода. Таким образом," это "больше не будет относиться к исходному объекту, а скорее к новому (или глобальному объекту" окно"). Если вы покажете нам свой код, мы сможем определить проблему.


Я подозреваю, что вы делаете что-то вроде этого:

$('#element').click(function() {
    clickHandler();
});

В этом случае clickHandler будет вызываться в контексте объекта window. Чтобы сохранить правильный контекст, просто измените код на:

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

Если вы хотите проверить, что передается, вы можете использовать мою версию или версию jquerylog Принцхорна. Это должно помочь вам определить шаг за шагом, что происходит:

http://www.jquerylog.com / https://github.com/fmsf/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>]