jQuery:如果在链中?

时间:2011-12-08 19:49:37

标签: javascript jquery if-statement method-chaining chain

我有这个

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

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

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

我在想像

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

提前致谢, 利奥

5 个答案:

答案 0 :(得分:11)

没有任何记录,如你所愿,但也许这对你有用:

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

为什么选择400,因为fadeOut的默认持续时间为400毫秒。 (from documentation

答案 1 :(得分: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为true,它将在删除之前分离元素,否则,它会在删除之前淡出它们。应该和你的代码一样高效,只需1行。

答案 2 :(得分:2)

对这样的事情有异议吗?

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

答案 3 :(得分:2)

var els = $(element).find("." + options.class);
if (!nodelay) els.fadeOut();
els.remove();

或者你可以使用可怕的黑客攻击:

$(element).find(…)[ nodelay ? 'somenoopfunction' : 'fadeOut' ]().remove();

答案 4 :(得分:1)

这个特殊问题:

尝试稍微重新考虑逻辑,并使noDelay 实际影响延迟

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

虽然我不确定remove()是否有必要。

当我对另一个问题进行fadeOut()测试时,它似乎隐藏并折叠元素。 remove()会从DOM中完全删除该元素,但我不确定是否有必要让它从文档中消失并让它停止影响文档流(没有间隙)。< / p>

真正的目标:

此外,您似乎计划包装jQuery。你最终会包装这样的代码:

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

...并将其更改为:

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

...或:

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

除非你计划重复使用那个特定元素,否则我认为你会浪费你的时间。 jQuery具有非常高效的一次性操作语法,您始终可以将匹配的元素存储在临时变量中。

如果您有其他一些我想念的目的,请原谅这种对您设计的干扰:)