К сожалению этот способ не помогает - все немного сложнее.
Задача - создать окно, аналогичное по функциям Джаваскриптовскому Confirm. Но чтобы оно было красивое ))). Функция получает в себя строки, которые будут выводитья в окне, и callback-функцию, которая будет быполняться в случае нажатия на кнопку подстверждения.
Вот функция вывода окна:
areYouSure: function(title,question,okText,cancelText,myCallback){
$.ajax({
url: "/views/V_Common/V_AreYouSure.php", //получаем с сервака ХТМЛ-код будущего окна
dataType: "html",
success: function(data) {
var sureBox = $(data); //начинаем создавать ДОМ-Элемент
sureBox.attr('title',title);
sureBox.find('p').text(question);
sureBox.find('#ok').text(okText);
sureBox.find('#ok').bind('click',myCallback); /*вешаем колбэк, на кнопку ОК (который, меня уже задолбал сразу запускаться)*/
sureBox.find('#ok').click(function(){sureBox.dialog( "close" );});
sureBox.find('#cancel').text(cancelText);
sureBox.find('#cancel').click(function(){sureBox.dialog( "close" );});
sureBox.appendTo($('body')); /*Запихиваем новый элемент в ДОМ и делаем из него выпадающее окошко при помощи jQuery UI*/
sureBox.dialog({resizable: false,
draggable: false,
modal: true,
show: 'fade',
hide: 'fade',
position: ['center',180]
});
},
error: function (XMLHttpRequest, textStatus, errorThrown){
Common.makeAlert('AJAX не прокатил', 'Какая-то ошибка');
}
});
}
Простой пример использования данной функции:
askLogout: function(){
this.areYouSure('Предупреждение', 'Вы уверенны что хотите выйти?', 'Выйти', 'Нет', this.logout())
},
logout: function(){
document.location.href = "/logout/";
},
Пример использования чуть посложнее:
Common.areYouSure('Предепреждение',
'После удаления группу будет невозможно восстаеновить.Вы уверены что хотите удалить эту группу?',
'Удалить группу', 'Отмена',
Groups.destroy(id_group));
destroy: function(id_group){
//alert('Удалялка группы' + id_group);
$.ajax({
type: "POST",
url: "/index.php?controller=C_Groups&method=destroyGroup",
data: 'id_group=' + id_group,
dataType: "xml",
success: function(data) {
var canDestroy = $(data).find('canDestroy').text();
switch (canDestroy) {
case 'yes':
Common.makeAlert('Поздравляем!', 'Вы удалили данную группу');
break;
case 'notOwner':
Common.makeAlert('Предупреждение!', 'Вы не можете удалить эту группу потому-что не являетесь ее владельцем');
break;
default:
break;
}
},
error: function (XMLHttpRequest, textStatus, errorThrown){
Common.makeAlert('AJAX не прокатил', 'Какая-то ошибка');
}
});
}
Это к тому что каждый раз в колбэк может передаваться разное количество параметров, а могут не передаваться и вовсе. И функции - колбэки могут быть слишком громоздкими, для того чтобы - делать их анонимными.
Пока-что я нашел такой рабочий способ вызова, но он не очень хорош:
askLogout: function(){
this.areYouSure('Предупреждение',
'Вы уверенны что хотите выйти?',
'Выйти',
'Нет',
function(){Common.logout()})
},
Данный способ плох по следующей причине:
logout и areYouSure являются методами одного и того-же обьекта common. Приходиться вызывать метод текущего объекта не по-человечески через this (this.logout()), а через конкретно его имя (Common.logout()), что не очень-то красиво.
Я даже вопрос немного переформулировал:
Как правильно и красиво передать внутрь функции А параметром функцию Б в виде колбека, чтобы выполнилось следующее:
1 - Функция Б (колбэк) будет подписана на событие внутри функции А
2 - Функция Б может оказатья любой, следовательно количество передаваемых параметров в функцию Б может быть различное.