Подтвердить что ты не робот

Метод jQuery.on() - передача аргумента функции обработчика события

У меня есть следующий script, который не работает

<script type="text/javascript" >

   function ADS(e){ alert(e); }

   $(document).ready(function(){
          $(document).on("dblclick","#an_tnam tr", ADS('hello'));
          $(document).on("dblclick","#kv_tnam tr", ADS('world'));
          // ....  
 });

</script>

как передать аргумент функции обработчика событий ADS?

4b9b3361

Ответ 1

Функция .on() ожидает передачи функции; то, что вы делаете, вызывает функцию и передает ее возвращаемое значение. Если вам нужно передать параметр, вам нужно будет обернуть вызов анонимной функцией.

$(document).on('dblclick', '#an_tnam tr', function(event) {
    ADS('hello');
});

jQuery всегда передает свой нормализованный объект события в качестве первого аргумента функции, подлежащей выполнению.

Ответ 2

Вы можете передать дополнительные данные функции обработки событий и получить доступ с помощью event.data внутри обработчика.

$(document).on('dblclick', '#an_tnam tr', { extra : 'random string' }, function(event)
{
    var data = event.data;

    // Prints 'random string' to the console
    console.log(data.extra);
}

Вы также можете отправлять дополнительные данные в любое событие, которое вам нравится, при запуске события из внешнего источника с помощью метода .trigger()

$('#an_tnam tr').trigger('click', [{ extra : 'random string' }]);

Разница с передачей данных методу триггера заключается в том, что он ожидает, что обработчик примет дополнительные аргументы длины переданного массива. Вышеизложенное ожидало бы, что обработчик должен иметь один дополнительный аргумент, чтобы содержать переданный объект.

$('#an_tnam tr').on('click', function(event, obj)
{
   // Prints 'random string' to the console
   console.log(obj.extra);
}

Ответ 3

Как отметил Anthony Grist, метод .on() ожидает ссылки на функцию в этой части; вы оцениваете функцию, которая ничего не возвращает (null).

Однако одна интересная особенность JavaScript заключается в том, что все является объектом, включая функции. С небольшой модификацией вы можете изменить ADS() для возврата анонимного объекта функции:

function ADS(e){ 
    return function(){ alert(e); };
}

http://jsfiddle.net/cSbWb/

Ответ 4

На самом деле, есть очень простой простой способ добиться этого, без лишних помех и анонимных функций, используя JS bind():

$(document).on('dblclick', ADS.bind(null, 'hello'));

Первый параметр - это значение, которое вы хотите, чтобы "это" имело внутреннюю функцию обратного вызова.

Информация о MOre в Mozilla Developer Network: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_objects/Function/bind

Ответ 5

function ADS(e){ alert(e); }

$(document).ready(function(){
          $(document).on("dblclick","#an_tnam tr", function (e) { ADS('hello') });

 });

сделает трюк.

Ответ 6

function ADS(e) {
    return function() {
        alert(e);
    };
}

Подобно этому, когда вы делаете

$(document).on("dblclick","#an_tnam tr", ADS('hello'));

это возвращаемая функция, назначенная как обработчик событий (и ваш строковый аргумент передается при назначении обработчика, а не при его вызове).