2014-09-18 6 views
1

У меня есть следующий код:Pass объект в качестве параметра

$('.helloWorld').on('click', function() { 
    $(this).css('background', 'black'); 
}); 

Вместо этого, я хотел бы сделать что-то вроде этого (для исследования):

var params = [ 
    'click', 
    function() { 
     $(this).css('background', 'black'); 
    } 
]; 

$('.helloWorld').on(params); 

Я получаю сообщение об ошибке, что читает, " Uncaught SyntaxError: Неожиданный токен,. "

Возможно ли это? Если да, то как?

+0

возможно дубликат [Вызов динамической функции с помощью динамических параметров в JavaScript] (http://stackoverflow.com/questions/676721/calling- dynamic-function-with-dynamic-parameters-in-javascript) – dave

+0

Я думаю, вам нужно использовать что-то вроде '$ .fn.on.apply ($ (". selector "), params);', но я могу быть выключен – Ian

+1

Вопрос в том, почему вы используете массив? Пока массив выглядит так, только с одним событием вы можете использовать 'apply', но гораздо проще использовать объект, таким образом вы можете добавить столько событий и обратных вызовов, сколько хотите? – adeneo

ответ

4

Вы можете использовать apply для вызова функции, используя массив в качестве аргументов, необходимо указать thisArg хотя:

$.fn.on.apply($('.helloWorld'), params); 
+1

Почему бы просто не ссылаться на '$ .fn.on' вместо хранения результатов селектора? – Ian

+1

@Ian Хорошая точка, это проще. – Paulpro

3

Вы используете массив в вашем примере. Используйте объект вместо ({} вместо []) Что-то, как это должно работать:

var params = { 
    "event" : 'click', 
    "callback" : function() { 
     $(this).css('background', 'black'); 
    } 
}; 

$('.helloWorld').on(params.event, params.callback); 
+1

Они целенаправленно используют массив. Вопрос не в том, как сделать это по-другому. Это очень возможно с массивом, как показал Paulpro. Я не говорю, что это плохая альтернатива, но на самом деле это не отвечает на вопрос. И если они собираются использовать объектный литерал, было бы разумнее использовать 'var params = {on: function() {....}}; $ (""). on (params); ' – Ian

+1

Понял, но они целенаправленно используют массив? ОП никогда не говорил этого. – sma

+0

Хммм, снова прочитав его, ты прав. Это было не так прямо, как я помнил. Тем более, что они сказали «для исследования». Я предполагаю, что я больше говорю о том, что они, похоже, хотят передать ** один параметр ** (это название, технически) на вызов '.on()', который кажется целенаправленным. В вашем ответе по-прежнему используются два параметра: просто хранить их в одном месте вместо двух варов. – Ian

Смежные вопросы