jQuery сокращение «каждый»

Есть ли способ, которым я могу сократить 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
}

person Jetz Ki    schedule 11.09.2013    source источник
comment
Дайте им тот же класс, что и $('.thesameClass').each(function() { });   -  person HTTP    schedule 11.09.2013
comment
Чего вы пытаетесь достичь?   -  person undefined    schedule 11.09.2013
comment
что такое foo и otherfoo - откуда они берутся? вы можете поместить их в атрибут данных элемента, а затем просто вызвать один цикл, передавая атрибут данных в functionName   -  person Pete    schedule 11.09.2013
comment
$('someElement').each(functionName) было бы короче, если бы функция не нуждалась в параметрах.   -  person nnnnnn    schedule 11.09.2013
comment
каждый раз, когда вызывается functionName, существует уникальное значение для параметров foo и element. поэтому каждый раз, когда я вызываю functionName внутри каждого оператора, скорее всего, значения отличаются от других. Я хотел знать, есть ли способ, которым я могу сократить каждый, как вы, сократить оператор условия if   -  person Jetz Ki    schedule 11.09.2013
comment
Вы постоянно меняете вопрос. Обратите внимание, что всякий раз, когда вы меняете вопрос, вы делаете недействительными ответы, которые люди любезно предоставили.   -  person T.J. Crowder    schedule 11.09.2013


Ответы (4)


Что касается последней версии вопроса, где все три each используют одни и те же значения, лучше всего использовать селекторы с последовательностью запятых (если это селекторы ) или функцию add (если это не так):

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

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

or

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

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

Опять же, это зависит от того, являются ли 'someElement', 'anotherElement' и т. д. селекторами или элементами.

Поскольку вы используете each, который сразу же вызывает функцию, вы можете также использовать параметр curry ниже. Если бы вы использовали click или подобное, использование параметра curry ниже изменило бы, когда value2 был оценен (с момента вызова функции до момента ее каррирования), что может быть желательным или нежелательным в зависимости от вашего варианта использования.


Ответ на более раннюю версию вопроса:

К сожалению, вы не можете использовать для этого $.proxy или 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
}
person T.J. Crowder    schedule 11.09.2013
comment
@JetzKi: Рад, что помог. - person T.J. Crowder; 11.09.2013
comment
Привет Т.Дж. как профессионал, которым я действительно восхищаюсь, я буду очень признателен, если вы прокомментируете, если увидите потребность в моих вопросах и ответах здесь: stackoverflow.com/q /18749924/601179 - person gdoron is supporting Monica; 11.09.2013

Предполагая, что вы хотите расширить выбор, вас может заинтересовать функция .add():

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

применит вашу логику ко всем совпадениям someElement, а также onotherElement

person Nick Andriopoulos    schedule 11.09.2013

Изменить: это позволит вам передавать параметры в соответствии с редактированием вашего вопроса.

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 принимает не глобальные переменные, а передаваемые параметры.

person Andy    schedule 11.09.2013

person    schedule
comment
Это не делает то, что вы думаете / чего хочет ОП. Это ищет #onotherElement внутри #someElement. См. документацию. - person T.J. Crowder; 11.09.2013
comment
каждый раз, когда вызывается functionName, существует уникальное значение для параметров foo и element. поэтому каждый раз, когда я вызываю functionName внутри каждого оператора, скорее всего, значения отличаются от других. Я хотел знать, есть ли какой-нибудь способ, которым я могу сократить каждое, как вы, сокращенное выражение условия if - person Jetz Ki; 11.09.2013
comment
нет, он не ищет один элемент внутри какого-то элемента... вы можете добавить сколько угодно элементов, которые вы хотите, из любой части страницы. Каждый раз будет вызываться каждый раз.. - person Shashank; 11.09.2013
comment
$(document) .ready( function() { $( #autocomplete ).autocomplete({ source: [ c++, java, php, coldfusion, javascript, asp, ruby] }); $(#but,#cut).click (function(){ $('#autocomplete').autocomplete(close);});}); см. этот пример кода #cut и #but - это функция нажатия двух кнопок, которая вызывается, если нажата какая-либо кнопка - person Shashank; 11.09.2013
comment
Он ищет одно в другом. Чтобы найти любой элемент, вы должны передать одну строку с запятой внутри строки, например: $('#onotherElement,#someElement') - person nnnnnn; 11.09.2013
comment
@user2256955: нет, он не ищет один элемент внутри другого элемента Еще раз: прочтите документацию. Если вы в это не верите, возможно, вам поможет пример: jsbin.com/UwumUBU/1. - person T.J. Crowder; 11.09.2013