Что означает $($(this))?


Я видел некоторый код в интернете, который использует следующий оператор

if ($($(this)).hasClass("footer_default")) {
      $('#abc')
        .appendTo($(this))
        .toolbar({position: "fixed"});
    }

зачем $($(this)) а зачем это здесь нужно?

6   51   2014-02-10 11:16:25

6 ответов:

да $($(this)) Это то же самое, что $(this) на jQuery() или чудесно идемпотентных. Нет никакой причины для этой конкретной конструкции (двойная упаковка this), однако, что-то я использую в качестве ярлыка для захвата первого элемента только из группы, которая включает в себя аналогичную двойную обертку, является

$($('selector')[0])

что означает, захватить каждый элемент, который соответствует selector, (который возвращает объект jQuery), затем используйте [0] чтобы захватить первый в списке (который возвращает DOM объект), затем оберните его в $() снова превратить его обратно в объект jQuery, который на этот раз содержит только один элемент, а не коллекция. Это примерно эквивалентно

document.querySelectorAll('selector')[0];, что в значительной степени document.querySelector('selector');

вы можете обернуть $ столько раз, сколько вы хотите, это ничего не изменит.

если foo является элементом DOM,$(foo) вернет соответствующий объект jQuery.

если foo - это объект jQuery, $(foo) вернет тот же объект.

вот почему $($(this)) вернется точно так же, как $(this).

нет особой необходимости в двойной упаковке и $($(this)) точно так же, как $(this).

тем не менее, я однажды нашел эту двойную обертку в одном файле в моем проекте, совершенном другим разработчиком. Отслеживая изменения через ревизию, оказалось, что она началась как $($(this).find('selector').first()) - то есть результат некоторого селектора был обернут для создания нового объекта. Затем по каким-то причинам селектор был удален и только двойная упаковка this остались. Разумеется, при следующем коммите он был изменен на $(this).

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

кроме того, по соображениям производительности рекомендуется повторно использовать объекты jQuery - довольно дорого создавать объекты jQuery, особенно со сложными селекторами. Пример:

var $this = $(this);
if ($this.hasClass("footer_default")) {
    $('#abc')
        .appendTo($this)
        .toolbar({position: "fixed"});
}

просто google для 'jQuery best practices' - это займет 30 минут для вас, чтобы узнать это основы, и вы будете использовать jQuery более эффективно.

нет никакого смысла делать это.

следующий код возвращает то же самое:

console.log($($(this)).hasClass("footer_default"))
console.log($(this).hasClass("footer_default"))

логическое значение, определяющее, имеет ли выбранный элемент класс footer_default:

.Hasclass (className )возвращает: Boolean

демо: http://jsfiddle.net/IrvinDominin/aSzFn/

$(this) и $($(this)) оба возвращают объект jQuery.

нет никакой разницы между этими двумя.