Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Вызов подметода плагина jQuery (https://javascript.ru/forum/jquery/29271-vyzov-podmetoda-plagina-jquery.html)

antonM 21.06.2012 19:00

Вызов подметода плагина jQuery
 
Добрый день.

Делаю плагин. Структура примерно такова:
methods = {
    init: function() {...},
    messages: { 
        msgBox: function () {...},
        toolTip: function () {...}
    }
};


Обработчик вызова методов стандартный:
$.fn.myplugin = function(method) {
	if (methods[method]) {
		return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
	}
 	else if (typeof method === 'object' || !method) {
		return methods.init.apply(this, arguments);
	}
	else {
		$.error("Method not found!");
	}
};


Плагин я вызываю тоже стандартно:
$("#testdiv").myplugin()


Подскажите как вызвать подметод toolTip из метода messages?

Спасибо.

DjDiablo 22.06.2012 01:30

я не вижу у тебя метода messages откуда можно было вызвать tooltip, есть только обьект messages.
Ещё очень радует термин подметод :)

пока всё что я вижу, дак это то что.
1)если вызвать $("#testdiv").myplugin("init')-сработает функция init.
2)если вызвать $("#testdiv").myplugin(" messages')-будет ошибка.
3)если вызвать $("#testdiv").myplugin({x:100})-будет вызван метод init, и обьект {x:100} будет передан ему в качестве параметра.
4)если вызвать $("#testdiv").myplugin([100,300,400])-будет вызван метод init, и массив [100,300,400] будет передан ему в качестве параметра.
alert (typeof [10,200]);

5) если вызвать $("#testdiv").myplugin("hello")-будет выполнен $.error("Method not found!");
6) если вызвать $("#testdiv").myplugin() -будет выполнен $.error("Method not found!");

Опиши задачу подробнее.

antonM 22.06.2012 01:52

Я не претендую на правоту, написал как понимаю, хотя ошибку вижу свою :)
Получается messages это свойство объекта methods, а toolTip это метод messages. Верно? Мне надо вызвать именно метод toolTip.
Я не соображу как?
Что-то типа:
$("#testdiv").myplugin("messages[toolTip]", {аргументы})

DjDiablo 22.06.2012 02:02

кажется я понял.
messages[toolTip]- клёво ты придумал, такое можно разобрать регулярным выражением :)

однако если написать через точку то будет достаточно метода split.
$("#testdiv").myplugin("messages.toolTip", {аргументы}).


простой пример
m=method.split('.');//[messages,tooltip]
methods[m[0]][m[1]].apply(this, Array.prototype.slice.call(arguments, 1)


пример с учётом переменной длинны m,
при этом method может оказаться функцией а не обьектом

m=method.split('.');//[messages,tooltip]
metitem=methods;

     for (var i = 0; i < m.length; i++) {
         metitem=metitem[m[i]];
     }

metitem.apply(this, Array.prototype.slice.call(arguments, 1)

за точность не ручаюсь, лучше код перепроверте.

antonM 22.06.2012 02:54

Спасибо. Буду пробовать. О результатах напишу, может кому-то пригодиться.

antonM 25.06.2012 12:44

Получилось сделать вот так:
Добавил в функцию вызова метода:
else if (/\./.test(method)) {
		var m = method.split('.');
		return methods[m[0]][m[1]].apply(this, Array.prototype.slice.call(arguments, 1));
}

Спасибо за подсказку!


Часовой пояс GMT +3, время: 12:02.