jcuery's .click - передає параметри функції користувача


283

Я намагаюся викликати функцію з параметрами за допомогою .click jQuery, але я не можу змусити її працювати.

Ось як я хочу, щоб це працювало:

$('.leadtoscore').click(add_event('shot'));

який дзвонить

function add_event(event) {
    blah blah blah }

Він працює, якщо я не використовую параметри, наприклад:

$('.leadtoscore').click(add_event);
function add_event() {
    blah blah blah }

Але мені потрібно вміти передавати параметр моїй add_eventфункції.

Як я можу зробити цю конкретну річ?

Я знаю, що можу використовувати .click(function() { blah }, але я дзвоню add_eventфункцію з декількох місць і хочу це зробити так.


це прийнято з patricksвідповіді, що, на мій погляд, є чудовим рішенням: jsfiddle.net/naRRk/1
jAndy

Відповіді:


514

Для ґрунтовності я натрапив на інше рішення, яке було частиною функціоналу, представленого у версії 1.4.3 обробника подій jQuery click.

Це дозволяє передавати карту даних об'єкту події, який автоматично повертається до функції обробника подій jQuery як першого параметра. Карта даних буде передана .click()функції як перший параметр, після чого функція обробника подій.

Ось код, який пояснює, що я маю на увазі:

// say your selector and click handler looks something like this...
$("some selector").click({param1: "Hello", param2: "World"}, cool_function);

// in your function, just grab the event object and go crazy...
function cool_function(event){
    alert(event.data.param1);
    alert(event.data.param2);
}

Я знаю, що пізно в грі на це питання, але попередні відповіді привели мене до цього рішення, тому я сподіваюся, що він комусь допоможе!


11
Це саме те, що я хотів (тоді). Я не працював над цим проектом відтоді, але думаю, що я використовував 1.4.0. Це, безумовно, найкращий доступний спосіб.
Пол Гоффер

1
Я динамічно створюю об'єкт на стороні сервера і зв'язую подію натискання з: r.OnClientClick = "imageClicked ({param1: '" + obj.Command + "'}); повертаю false"; Тоді на стороні клієнта у мене є: функція imageClicked (подія) {if (event.param1 == "GOTO PREVIOUS") {... Якщо я використовую event.data.param1, він говорить, що це не визначено. Тепер я набрав це тут, я бачу різницю, d'oh!
Сім'я

1
@Family - Haaha немає проблем, приємно допомагати, навіть через коментарі;)
Кріс Кемпен

5
@totymedli - Я думаю, ви завжди можете його назвати десь в іншому місці, передаючи об'єкт тієї самої структури var param_obj = {data : {param1: "Hello", param2: "World"}}; cool_function(param_obj);:?
Кріс Кемпен

1
Це набагато краще, ніж використання атрибутів даних HTML5, дякую! (І вирішує JSHint скаржитися на використання "цього" в зворотному дзвінку!)
Matthew Herbst

77

Вам потрібно використовувати анонімну функцію на зразок цієї:

$('.leadtoscore').click(function() {
  add_event('shot')
});

Ви можете назвати його як у прикладі, просто ім'я функції без параметрів, наприклад:

$('.leadtoscore').click(add_event);

Але add_eventметод не отримає 'shot'як його параметр, а скоріше те, що clickпереходить до його зворотного виклику, який є самим eventоб'єктом ... тому він не застосовується в цьому випадку , але працює для багатьох інших. Якщо вам потрібно передати параметри, використовувати анонімну функцію ... або, є один інший варіант, використовувати .bind()і передавати дані, як це:

$('.leadtoscore').bind('click', { param: 'shot' }, add_event);

І отримати доступ до нього add_event, як це:

function add_event(event) {
  //event.data.param == "shot", use as needed
}

Якщо ви просто говорите, це означає лише це? По-друге, чи означає це, що я міг би використовувати $ (це) всередині своєї функції add_event, як, як правило, всередині анонімної функції?
Пол Гоффер

2
@phoffer - Так, "просто" означає відсутність парам, лише ім'я функції, це посилання на функцію, а не результат запуску функції, яку потрібно призначити clickобробнику. У .bind()наведеному вище анонімному методі та прикладах thisвін посилатиметься на .loadtoscoreнатиснуті вами кнопки (як ви очікували). В останньому прикладі, в add_event(event)те ж саме вірно, використання thisабо $(this)і це буде те , що ви хочете.
Нік Крейвер

1
@phoffer: Вам потрібно буде явно передати елемент, щоб використовувати його, наприклад: function(){ add_event('shot', $(this));}і function add_event(event, element){...}. elementтут буде елементом jQuery (він працює з тим, bind()як згадував Нік).
Фелікс Клінг

@Felix - Він також може використовуватись $(this)у межах функції, наприклад: jsfiddle.net/tSu5t
Nick Craver

35

Якщо ви називаєте це так, як у вас це було ...

$('.leadtoscore').click(add_event('shot'));

... вам потрібно мати add_event()функцію повернення, наприклад ...

function add_event(param) {
    return function() {
                // your code that does something with param
                alert( param );
           };
}

Функція повертається і використовується як аргумент для .click().


@jAndy - Дякуємо, що розмістили приклад, включаючи eventпараметр. Я повинен був це включити. : o)
користувач113716

27

Я мав успіх у використанні .on () так:

$('.leadtoscore').on('click', {event_type: 'shot'}, add_event);

Тоді всередині add_eventфункції ви отримуєте доступ до "shot" таким чином:

event.data.event_type

Докладнішу інформацію див . У документації .on () , де вони наведено наступний приклад:

function myHandler( event ) {
  alert( event.data.foo );
}
$( "p" ).on( "click", { foo: "bar" }, myHandler );

11

Так, це стара публікація. Незважаючи на те, хтось може вважати це корисним. Ось ще один спосіб надсилання параметрів обробникам подій.

//click handler
function add_event(event, paramA, paramB)
{
    //do something with your parameters
    alert(paramA ? 'paramA:' + paramA : '' + paramB ? '  paramB:' + paramB : '');
}

//bind handler to click event
$('.leadtoscore').click(add_event);
...
//once you've processed some data and know your parameters, trigger a click event.
//In this case, we will send 'myfirst' and 'mysecond' as parameters
$('.leadtoscore').trigger('click', {'myfirst', 'mysecond'});

//or use variables
var a = 'first',
    b = 'second';

$('.leadtoscore').trigger('click', {a, b});
$('.leadtoscore').trigger('click', {a});

6
      $imgReload.data('self', $self);
            $imgReload.click(function (e) {
                var $p = $(this).data('self');
                $p._reloadTable();
            });

Встановіть об'єкт javaScript на елемент onclick:

 $imgReload.data('self', $self);

отримати об’єкт від елемента "цей":

 var $p = $(this).data('self');

Дивовижно! На жаль, це єдине, що працює, коли я намагаюся використовувати змінні jquery! не знаю чому. : |
Крегокс

3

Я отримую просте рішення:

 <button id="btn1" onclick="sendData(20)">ClickMe</button>

<script>
   var id; // global variable
   function sendData(valueId){
     id = valueId;
   }
   $("#btn1").click(function(){
        alert(id);
     });
</script>

Я маю на увазі те, що передайте onclickподію значення в javascript function sendData(), ініціалізуйте до змінної і перейміть її методом обробника подій jquery.

Це можливо, оскільки спочатку sendData(valueid)викликається і ініціалізується значення. Потім після події jquery виконайте виконання і використовуйте це значення.

Це пряме рішення вперед і для детального рішення перейдіть сюди .


Я не бачу способу передачі тут динамічних параметрів, лише твердо кодовані значення.
користувач1451111

таким чином ви передаєте тільки valueId і втрачаєте елемент та об'єкти події.
Золтан Суле
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.