Да в принципе подправил код. Кому интересно, можно вместе улучшить код.
К любому элементу на страницы применяем метод .hide_by_click(e); и при клике в любою область отличную от этого элемента - он будет скрываться с экрана(нужно для всплывающих окон и меню). Не нравится мне, что в этот метод нужно передавать обязательно event, во внутрь самой функции поместить не удается.
Вот сам код этой функции:
jQuery.fn.hide_by_click=function(e){
e.preventDefault();
array_list=$('body').data('hide_by_click_list');
if (array_list instanceof Array){
for (key in array_list){
if (array_list[key]==$(this)) return;
}
array_list.push($(this));
}else{
array_list=[$(this)];
}
$('body').data('hide_by_click_list',array_list);
$('body').off('click.hide_by_click');
$('body').on('click.hide_by_click',function (event){
if (event.isDefaultPrevented()==true) return;
array_list=$('body').data('hide_by_click_list');
for (key in array_list){
array_list[key].stop();
if(!$(event.target).closest(array_list[key]).length){
array_list[key].fadeOut();
array_list.splice(key,1);}
}
if (full_null(array_list))
$('body').off('click.hide_by_click');
else
$('body').data('hide_by_click_list',array_list);
})
}
Она запоминает все элементы конторые нужно скрыть в переменной 'hide_by_click_list' у элемента body. При клике на любую область, она перебирает все элементы из этого списка и если клик не был по нему - он удаляется. В конце, если список hide_by_click_list пуст, то обработчик удаляется с body.
Также для точности прменяю следующую функцию.
function full_null(elem){//Проверка на полный ноль. отстутсвие или несуществование.
if (elem=='undefined' || elem==null || elem==""){
return true;
}else return false;
}
Разные браузеры по разному видят переменные, если их нет, кто-то undefined, кто-то null, поэтому приходится применять эту конструкцию. Может есть попроще вариант?