Метод 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?
Ответы
Ответ 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'));
это возвращаемая функция, назначенная как обработчик событий (и ваш строковый аргумент передается при назначении обработчика, а не при его вызове).