При создании плагина jQuery должен ли `this` всегда быть нативным элементом DOM в любых обратных вызовах? - PullRequest
1 голос
/ 25 марта 2011

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

$('#something').waitForImages(function() {
   $(this).fadeIn(500);
});

Это очень похоже на код, который вы ожидаете в jQuery API.

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

Первоначально , я предоставил this в качестве объекта jQuery. Но затем, наблюдая за обработкой jQuery this, , я изменил ее .

Какой самый лучший способ? Чтобы его завернули или нет?

Ответы [ 4 ]

6 голосов
/ 25 марта 2011

Я бы сказал, оставьте его развернутым в этой ситуации, так как это, похоже, обработчик событий.В обработчике событий почти всегда (в jQuery и в необработанных обработчиках событий JS) вы ожидаете, что this будет элементом DOM , с которым вы имеете дело...это соглашение, которое я буду придерживаться.

Обычно старайтесь придерживаться принципа наименьшего удивления, когда можете.

Если хотите, вы также можете передать обернутый элемент в качестве параметра функции, например:

$('#something').waitForImages(function(e, jQueryObjectHere) {
   $(this).fadeIn(500);
});

... таким образом, вы не делаете чего-то неожиданного, но предоставляете вкусности, если они этого хотят.Я бы ни в коем случае не сказал, что это необходимо , просто удобно.Выше приведен только вариант (на самом деле случайная мысль) ... хотя, если вы выставили это событие как нечто, вы можете .bind() to, не сделать это, так как они могутсвязывать дополнительные данные и ожидать, что.

2 голосов
/ 25 марта 2011

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

Ваш код будет перебирать коллекцию и в любом случае выполнять обратный вызов для любых элементов, так что вы можете думать о каждом обратном вызове, уникальном для отдельного элемента в коллекции, а не о том, что он выполняется один раз для всей коллекции в целом.

Надеюсь, это объясняет рациональное и высокоуровневое видение выбора дизайна. Это сводится к семантике и последовательности.

1 голос
/ 25 марта 2011

Много раз, когда я пишу плагин jQuery, я немедленно назначаю this переменной, например:

$.fn.myPlugin = function () {
  var $this = this;
};

Основная причина в том, что я могу сослаться на исходный селектор внутри внутренней функции, которая переопределяет this, но здесь важнее то, что this сам по себе выглядит как развернутый элемент DOM, поэтому $ перед $this помогает мне вспомнить, что он уже завернут.

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

0 голосов
/ 25 марта 2011

this относится к массиву выбранных элементов, который был возвращен функцией jQuery.Переупаковка элементов крайне не нужна.

...