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