Сразу прощу прощения, если написано сильно криво, с js сталкиваться особо не приходится
Всё началось с необходимости аналога onBlur для div'a - при нажатии появляется подобие календаря, при клике в любую область - календарь пропадает. Первым пришедшим в голову решением было:
// Удаляется div с календарём
// Очищается onclick
function closeCalendar(calendar) {
if (typeof(calendar) === 'string') calendar = document.getElementById(calendar);
if (!calendar) return;
calendar.parentNode.removeChild(calendar);
document.onclick = null;
}
function openCalendar(clr) {
if (!clr || !clr.id) return;
var id = clr.id.split('_').slice(2).join('_');
// Сперва вызываем onclick, чтобы закрыть предыдущий календарь,
// если он уже открывался
if (document.onclick) document.onclick();
document.onclick = function(e) {
var targ;
if (!e) var e = window.event;
if (e.target) targ = e.target;
else if (e.srcElement) targ = e.srcElement;
if (targ.nodeType == 3) targ = targ.parentNode;
if (targ != document.getElementById('open_calendar_' + id))
closeCalendar('calendar_' + id);
};
/* Создаётся div
И в него вставляется таблица с календарём
*/
}
Но при таком подходе document.onclick полностью занят логикой с календарём. Для возможности использовать onclick добавил следующую конструкцию:
var docOnClickObj = function() {
if (typeof arguments.callee.instance=='undefined') {
arguments.callee.instance = new function() {
var _f = {};
// Имя + функция = добавить
// Имя = удалить
this.Func = function(newFuncName, newFunc) {
if (typeof newFuncName != 'undefined') {
if (typeof newFunc != 'undefined')
_f[newFuncName] = newFunc;
else
delete _f[newFuncName];
}
return _f;
}
this.addFunc = function(f_name, f) {this.Func(f_name, f);};
this.delFunc = function(f_name) {this.Func(f_name);};
this.docOnClick = function() {var a = docOnClickObj().Func(); for (var f in a) {a[f]();}};
document.onclick = this.docOnClick;
};
}
return arguments.callee.instance;
};
function closeCalendar(calendar) {
...
docOnClickObj().delFunc('close_calendar');
}
function openCalendar(clr) {
...
if (docOnClickObj().Func()['close_calendar'])
docOnClickObj().Func()['close_calendar']();
var f = function(e) {...}
docOnClickObj().addFunc('close_calendar', f);
}
Хотелось бы узнать мнение понимающих людей: имеет ли смысл использовать синглтон для задания набора функций при document.onclick или же есть более простые способы? Заранее спасибо