Как использовать $(this) в аргументах JQuery плагина?

Доброй ночи.

Я не особо силен в JS и в JQuery в частности, поэтому прошу ногами не пинать. Могу путаться в терминологии.
Возникла потребность в использовании плагина для создания контекстных менюшек (GitHub). Его обработчик должен навешиваться на строки таблицы, а действия должны зависеть от конкретной строки, поскольку каждая строка содержит информацию в data-атрибуте.

ffce6888282e4004987be1c774c59fc2.png

Нужно сделать как-то так (действие в данном плагине может описываться как функцией, так и строкой-ссылкой):
$("table tr").bootstrapContextMenu({
    items: [
        {
            title: "Действие 1", 
            target: function() { alert( $(this).data("somedata") ); }
        },
        {
            title: "Действие 2",
            target: '/someaction/' + $(this).data("somedata")
        }
    ]
});

Понятное дело, $(this) в таком случае — undefined.
Как поступить? Как передать плагину информацию из data-атрибута конкретного (используемого в данный момент времени) DOM элемента?


Т.е. я хочу, чтобы при вызове контекстного меню 5 строки таблицы (в data-somedata атрибуте которой хранится "tr_5") в "действии 2", например, генерировалась ссылка "/someaction/tr_5".

UPD1: С JSFiddle можно поиграться здесь.

UPD2: Решение найдено. JSFiddle обновлен.
$("table tr").each(function() {
    $(this).bootstrapContextMenu({
        items: [
            {
                title: "Действие 1", 
                target: function() { alert( $(this).data("somedata") ); }
            },
            {
                title: "Действие 2",
                target: '/someaction/' + $(this).data("somedata")
            }
        ]
    });
});
  • Вопрос задан
  • 2727 просмотров
Решения вопроса 1
FedorK
@FedorK Автор вопроса
В качестве решения элегантнее всего использовать each. Помог вот этот ответ на StackOverflow.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
iiil
@iiil
Инженер и вэб-дизайнер, рисую.
Попробуйте так, но не уверен. Может примерчик накидаете на jsfiddle.net?
$("table tr").bootstrapContextMenu({
        var tr = $(this);
	items: [
		{
			title: "Действие 1", 
			target: function() { alert( tr.data("somedata") ); }
		},
		{
			title: "Действие 2",
			target: '/someaction/' + tr.data("somedata")
		}
	]
});
Ответ написан
fornit1917
@fornit1917
Задайте контекст вызова через $.proxy

target: $.proxy(function() { alert( $(this).data("somedata") ); }, this)


Подробнее например тут:
jquery.page2page.ru/index.php5/%D0%98%D0%B7%D0%BC%...
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы