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

Хранение функции с помощью метода jQuery data()

Документация jQuery . data() сообщает следующее:

The .data() method allows us to attach data of any type to DOM element

Я предполагаю, что "любой тип" относится и к функциям. Скажем, у меня есть div с id foo как таковым:

<div id="foo">Foo!</div>

И я хотел бы сохранить в нем функцию под названием say, которая принимает параметр. Согласно документации, я сохранил функцию следующим образом:

$("#foo").data("say", function(message){
   alert("Foo says "+message);
});

Мой вопрос: как мне вызвать функцию с параметром, когда я этого хочу сделать.

$("#foo").data("say"); должен возвращать функцию, но как бы передать ей параметр?

Спасибо!

4b9b3361

Ответ 1

var myFunction = $("#foo").data("say");
myFunction(someParameter);

Ответ 2

Лучшей альтернативой хранению функций в data является использование пользовательских событий. Это можно легко сделать с помощью on и trigger:

$('#foo').on('say', function(e, arg){
    alert('Foo says ' + arg);
});

$('#foo').trigger('say', 'hello');

Пример: http://jsfiddle.net/tW66j/

Примечание: в предыдущих версиях jQuery (до 1.7) вместо .on использовался .bind.

Ответ 3

Здесь более элегантный способ вызова метода.

// store the method with data
$('#foo').data('bar',function(){console.log("Givin it the business!")});

// Simple execution (this will not keep the method in scope)
$('#foo').data('bar')();

// scoped method execution with call([scope,arguments[]]), takes arguments with comma separation
$('#foo').data('bar').call($('#foo').first()[0],'arguemnts','for','method');

// scoped method execution with apply(scope[,argument[]]), takes an array of arguments
$('#foo').data('bar').apply($('#foo').first()[0],['arguemnts','for','method']);

Применить метод: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/apply

Метод вызова: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/call