0

有什么办法可以缩短每个 jquery 吗?或者是否有任何替代方法来编写比下面的代码更短的 jquery?

$('someElement').each(function () {
    functionName('value1', value2)
});
$('anotherElement').each(function () {
    functionName('value1', value2)
});
$('andMoreElement').each(function () {
    functionName('value1', value2)
});

functionName(foo, element){
   //function code here
}
4

4 回答 4

3

在问题的最新版本中,所有三个都each使用相同的值,最好使用逗号系列的选择器(如果它们是选择器)或add函数(如果它们不是):

$('someElement, anotherElement, andMoreElement').each(function () {
    functionName('value1', value2)
});

functionName(foo, element){
   //function code here
}

或者

$('someElement').add('anotherElement').add('andMoreElement').each(function () {
    functionName('value1', value2)
});

functionName(foo, element){
   //function code here
}

同样,这取决于'someElement''anotherElement'等是选择器还是元素。

因为您使用each的是立即调用该函数的 ,所以您也可以使用curry下面的选项。如果您正在使用click或类似的,使用curry下面的选项会在value2被评估时改变(从函数被调用到被柯里化),这可能是可取的或不可取的,具体取决于您的用例。


回答问题的早期版本

可悲的是,您不能使用$.proxyor Function#bind,因为它们都会改变this调用中的值。您可以创建一个重用调用它的curry函数this

var slice = Array.prototype.slice;
function curry(f) {
    var args = slice.call(arguments, 1); // Copy args after `f`
    return function() {
        return f.apply(this, args.concat(slice.call(arguments, 0)));
    };
}

当您将一个函数和 X 个参数传递给 时curry,它会返回一个函数,该函数在调用时将使用调用this它的值、提供给 的参数curry以及提供给调用的任何参数来调用原始函数。

然后:

$('someElement').each(curry(functionName, 'foo'));
$('anotherElement').each(curry(functionName, 'otherFoo'));
$('andMoreElement').each(curry(functionName, 'otherFoo'));

functionName(foo){
   //function code here
}

或者作为后两个用途具有相同的论点:

$('someElement').each(curry(functionName, 'foo'));
$('anotherElement, andMoreElement').each(curry(functionName, 'otherFoo'));
// Or:
$('anotherElement').add('andMoreElement').each(curry(functionName, 'otherFoo'));

functionName(foo){
   //function code here
}
于 2013-09-11T09:43:43.437 回答
2

假设您要扩大选择范围,您可能对以下.add()功能感兴趣:

$('someElement').add('onotherElement').each(function() { })

会将您的逻辑应用于所有匹配项someElement以及onotherElement

于 2013-09-11T09:42:41.133 回答
1
 $('#onotherElement','#someElement').each(function () {
        functionName('foo')
    });
于 2013-09-11T09:43:43.593 回答
1

编辑:这将允许您根据问题中的编辑传递参数。

var a = 'Function', b = 'works';

$('.a').each(foo.bind(this, a + 'foo', b + 'foo')); // (1)

function foo(a, b, i, el) {
  console.log(a, b, $(el).text());
}

JSfiddle

(1)我将 foo 添加到 vars 以证明它foo不是拾取全局变量,而是传入的参数。

于 2013-09-11T09:50:11.373 回答