4

我有这个

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

有没有办法可以避免重复句子,只在fadeOut()满足给定条件时添加?

我不能移动fadeOut()到链条的末端,这可能会使事情变得更容易。

我在想类似的东西

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

在此先感谢,狮子座

4

5 回答 5

11

没有像您想要的那样记录在案,但也许这对您有用:

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

为什么是 400,因为 fadeOut 的默认持续时间是 400 毫秒。(来自文档

于 2011-12-08T19:55:41.787 回答
3

你可以用 $.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 为真,它会在移除之前分离元素,否则,它会在移除之前将它们淡出。应该和你的代码一样高效,就在 1 行。

于 2011-12-08T19:53:51.477 回答
2

对这样的事情有异议吗?

var $found = $(element).find("." + options.class);
if (noDelay){
  $found.remove();
} else {
  $found.fadeOut().remove();
}
于 2011-12-08T19:56:04.860 回答
2
var els = $(element).find("." + options.class);
if (!nodelay) els.fadeOut();
els.remove();

或者你可以使用一个可怕的黑客:

$(element).find(…)[ nodelay ? 'somenoopfunction' : 'fadeOut' ]().remove();
于 2011-12-08T19:56:11.227 回答
1

这个特殊的问题:

试着稍微重新思考一下逻辑,让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 为一次性操作提供了非常高效的语法,并且您始终可以将匹配的元素存储在临时变量中。

如果您有我遗漏的其他目的,请原谅这种对您设计的入侵:)

于 2011-12-08T20:02:38.333 回答