JQuery: если внутри цепочки? - PullRequest
       14

JQuery: если внутри цепочки?

4 голосов
/ 08 декабря 2011

У меня есть

if(noDelay){
  $(element).find("." + options.class).remove();
} else {
  $(element).find("." + options.class).fadeOut().remove();
}

Можно ли как-нибудь избежать повторения предложения и добавить fadeOut() только при выполнении определенного условия?

Я не могу двигаться fadeOut() до конца цепочки, что, вероятно, сделало бы все проще.

Я думаю что-то вроде

$(element).find("." + options.class).(if(noDelay) fadeOut()).remove();

Заранее спасибо, Leo

Ответы [ 5 ]

11 голосов
/ 08 декабря 2011

Там нет ничего задокументированного, как вы хотите, но, возможно, это будет работать для вас:

$(element).find("." + options.class).fadeOut(noDelay ? 0 : 400).remove();

Почему 400, потому что длительность по умолчанию для fadeOut составляет 400 миллисекунд.( из документации )

3 голосов
/ 08 декабря 2011

Вы можете сделать это с $ .fn.each:

$(element).find("." + options.class).each(function(){
  if (nodelay) {
    $(this).remove();
  }
  else {
    $(this).fadeOut().remove();
  }
});

однако это гораздо менее эффективно, чем просто делать то, что вы уже делаете.

Редактировать: вот еще один способ сделать это:

$(element).find("." + options.class)[  noDelay ? "detach" : "fadeOut"  ]().remove();

По сути, если noDelay имеет значение true, элементы будут удалены перед удалением, иначе они исчезнут перед удалением. Должен быть таким же эффективным, как и ваш код, всего в 1 строку.

2 голосов
/ 08 декабря 2011
var els = $(element).find("." + options.class);
if (!nodelay) els.fadeOut();
els.remove();

Или вы можете использовать ужасный хак:

$(element).find(…)[ nodelay ? 'somenoopfunction' : 'fadeOut' ]().remove();
2 голосов
/ 08 декабря 2011

Есть возражения против чего-то подобного?

var $found = $(element).find("." + options.class);
if (noDelay){
  $found.remove();
} else {
  $found.fadeOut().remove();
}
1 голос
/ 09 декабря 2011

Эта конкретная проблема:

Попробуйте немного переосмыслить логику и заставить noDelay реально повлиять на задержку .

$(element).find("." + options.class).fadeOut(noDelay ? 0 : 'normal').remove();

Хотя я неконечно, если remove() необходим.

Когда я выполнял fadeOut() тесты для другого вопроса, он, казалось, скрывал и сворачивал элемент.remove() полностью удалит элемент из DOM, но я не уверен, что это необходимо, если вы просто хотите, чтобы он исчез из документа и перестал влиять на поток документов (без пробела там, где он был).

Реальная цель:

Кроме того, похоже, что вы планируете обернуть jQuery.В итоге вы закроете код следующим образом:

$("someElement").find(".someClass").fadeOut().remove();

... и измените его на что-то вроде:

fadeOut("someElement", { "class" : "someClass" });

... или:

var element = new SomeClass("someElement");
element.options.class = "someClass";
element.fadeOut();

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

Если у вас есть какая-то другая цель, которую я пропускаю, прошу прощения за это вторжение в ваш дизайн:)

...