Javascript jQuery是否有一个通用回调来避免断链?

Javascript jQuery是否有一个通用回调来避免断链?,javascript,jquery,Javascript,Jquery,有时,我发现自己非常高兴地通过一组jQuery函数链接起来,直到遇到一个条件 然后,我必须将我的链分解成不同的块,对每个块应用变量,并重新思考这个过程 考虑以下代码段: var$options=$(“#options”); $options.on('click','.addoption',函数(){ $(本) .parent() .clone() .find('输入') .val(“”) .parent() .appendTo($options) .find('标签') .html(“”);

有时,我发现自己非常高兴地通过一组jQuery函数链接起来,直到遇到一个条件

然后,我必须将我的链分解成不同的块,对每个块应用变量,并重新思考这个过程

考虑以下代码段:

var$options=$(“#options”);
$options.on('click','.addoption',函数(){
$(本)
.parent()
.clone()
.find('输入')
.val(“”)
.parent()
.appendTo($options)
.find('标签')
.html(“”);
$(this.remove();
});

选择权
+

您可以使用.each函数并将回调传递给它以执行所需操作

...
.find('input')
.val('')
.each(function(jQueryObject){
if(myCondition){
  jQueryObject.addClass('myClass')
}
...

没有这样的方法。jQuery测试条件的方法是使用
filter
方法,顾名思义,该方法过滤集合。由于jQuery对象是元素的集合,因此该方法对于检查每个单独元素的属性非常有用,而不是用于常规条件。过滤并调用所需方法后,可以使用
.end()
方法获取预过滤集合

$object
  .filter(function() {
     return true || false;
  })
  .addClass()
  .end()
  ...
如果要测试条件并保留jQuery对象,可以缓存它并使用
If
语句

var $object = ...
              .find('input')
              .val('');

if ( condition ) {
   $object.addClass('class');
}
但是,如果您喜欢使用方法而不是缓存对象并使用
if
语句,则可以定义一个类似于
filter
方法的方法,但它过滤集合本身,而不是集合的元素

/**
  This method uses the jQuery `slice` method for slicing the collection.
  If the passed condition is a truhy value it returns the same collection,
  otherwise it returns the same collection without the elements. Using the
  `slice` is necessary for getting the pre-filter collection using the `end` method.
  @param {Boolean} condition
  @return {Object} the same jQuery object 
**/
$.fn.filterAll = function(condition) {
    return condition ? this.slice(0) : this.slice(0, 0);
};

$object
  .filterAll(condition)
  .addClass('foo')
  .end()
  ...
在这种情况下,还可以使用
addClass
回调函数。对集合中的每个元素执行一次回调函数。返回
null
时,jQuery不会修改元素的
className
属性

...
 .find('input')
 .val('')
 .addClass(function() {
    // `this` keyword here refers to each element in the collection
    return condition ? 'class' : null;
  })
 .parent()
...
尝试利用,
state
将是条件,
Boolean

或者

$.fn.doStuff = function(condition, method, args, that) {
  if (condition) this[method](args);
  return that || this
}

.each
做你想做的事(它在单个项目上工作得很好)“但这会涉及到对.addClass()…”的不必要的调用,讽刺的是,你的伪代码调用了两个函数。您正在调用许多方法。在列表中添加另一个方法并没有明显的区别。就我个人而言,我认为分解这个方法对可读性更好。虽然创建长链感觉很好,但它们更难阅读,尤其是当你以后回来做这些事情时maintenance@LightnessRacesinOrbit见更新后的帖子。包括
.toggleClass()
在post中,例如在OPS中描述的,您仍然没有真正阅读问题。“这是我可以通过扩展jQuery对象来实现的东西,但如果已经存在这样的功能,我不想着手重新发明轮子。”OP已经知道如何做到这一点,并且正在询问jQuery是否具有等效的内置功能。在开始回答问题之前,你应该认真阅读问题@LightnessRacesinOrbit可以使用
.on()
trigger()
和自定义事件,定义名称空间,尽管最简单的方法是组合方法等,以满足需求-如果“OP已经知道如何做”-而不是拼凑可能不会返回实际预期结果的jQuery方法。如果阅读jQuery文档而没有找到这样的方法,则不一定“重新发明轮子”,而是创建执行特定任务的方法。在这里,三元选择将是最简单的我不明白你的评论,对不起。看起来可能少了一些单词?你原来的
doStuff
是个不错的方法。第二个参数也可以是对象。然后我们可以遍历对象的属性并执行相应的jQuery方法。通过这种方式,我们可以避免链接执行多个jQuery方法的
doStuff
方法。
jQueryObject
将是collect at
中元素的
索引。每个(索引,元素)
都是正确的。我总是忘了.each是(索引、值、数组),因为我通常使用JavaScript的内置.forEach是(值、索引数组)。谢谢你的更正。