Добавить функцию закрытия окна в javascript

T
На сайте с 21.07.2008
Offline
43
2172

Есть скрипт показывающий скрытые окна. Эти окна закрываются только при нажатии на кнопку "закрыть" в окне. Хотелось бы добавить возможность закрытия окна при клике вне его области или через некоторое время после того как мышь окажется вне его области. Я в этом полный профан, поэтому буду благодарен если подскажите куда и что дописать чтобы решить задачу.

function show (evt, id) {

var evt = evt || window.event;
var o = evt.target || evt.srcElement;
var f = document.getElementById('cur_popup_note');
if (f == null) {
f = document.createElement('div');
f.setAttribute ('id', 'cur_popup_note');
f.setAttribute ('style',
'progid:DXImageTransform.Microsoft.Alpha(opacity=100); '+
'opacity: 1; display: block; top: 0px; left: 0px;'+
'width:300px; height:auto;');
f.setAttribute('class', 'popup');
document.body.appendChild(f);
}
f.opacityFilter = 0;
f.innerHTML = '<img src="images/x.png" height="13" width="13" border="0" id="x_image" '+
'style="cursor:pointer;float:right;" onclick="hide();">'+
'<div style="padding: 10px">' +
document.getElementById(id).innerHTML + '</div>';
f.className = 'popup_active';
f.style.filter = 'progid:DXImageTransform.Microsoft.Alpha(opacity=' + (f.opacityFilter * 100) + ');';
f.style.opacity = f.opacityFilter;
f.style.display = 'block';
var o_coords = getPosition(o);
var f_coords = getPosition(f);
var calculatedTop = (f.offsetTop + (o_coords.top - f_coords.top));
var calculatedLeft = (f.offsetLeft + (o_coords.left - f_coords.left));
if (calculatedTop + f.offsetHeight > document.body.offsetHeight)
calculatedTop = document.body.offsetHeight - f.offsetHeight;
if (calculatedLeft + 200 > document.body.offsetWidth)
calculatedLeft = document.body.offsetWidth - 220;
f.style.top = calculatedTop + 'px';
f.style.left = calculatedLeft + 'px';
window.setTimeout('animate()', 10);
evt.cancelBubble = true;
return false;
}

function hide() {
var div = document.getElementById('cur_popup_note');
if (div != null) {
div.className = 'footnote_new';
div.style.display = 'none';
}
return false;
}

function animate() {
var f = document.getElementById('cur_popup_note');
f.opacityFilter += 0.5;
f.style.filter = 'progid:DXImageTransform.Microsoft.Alpha(opacity=' + (f.opacityFilter * 100) + ');';
f.style.opacity = f.opacityFilter;
if (f.opacityFilter<1) window.setTimeout('animate()', 50);
}

function getPosition(offsetTrail) {
var offsetLeft = 0;
var offsetTop = 0;
while (offsetTrail) {
offsetLeft += offsetTrail.offsetLeft;
offsetTop += offsetTrail.offsetTop;
offsetTrail = offsetTrail.offsetParent;
}
return { left:offsetLeft, top:offsetTop }
}
Недорогой дизайн сайтов (/ru/forum/comment/4587374) | Портфолио (http://www.weblancer.net/users/translicent/portfolio/)
LS
На сайте с 08.10.2011
Offline
4
#1

Очень необычно видеть сырой код без фреймворков типа jq или mootols.

Для решения вашей проблемы нужно добавить еще одно событие например onmouseout в строках:

 f.innerHTML = '<img src="images/x.png" height="13" width="13" border="0" id="x_image" '+

'style="cursor:pointer;float:right;" onclick="hide();">'+
'<div style="padding: 10px">' +
document.getElementById(id).innerHTML + '</div>';

чтобы получилось:

 f.innerHTML = '<img src="images/x.png" height="13" width="13" border="0" id="x_image" '+

'style="cursor:pointer;float:right;" onclick="hide();" onmouseout="hide();">'+
'<div style="padding: 10px">' +
document.getElementById(id).innerHTML + '</div>';

Если закрытие картинки нужно не сразу, а с таймаутом обработчик нужно передать не на hide(), а на свою функцию которая вызовет hide с задержкой через setInterval.

Еще лучше начать использовать какой-то фреймворк где уже готовые абстракции. Например jquery.

T
На сайте с 21.07.2008
Offline
43
#2
LazySeo:
Очень необычно видеть сырой код без фреймворков типа jq или mootols.
Для решения вашей проблемы нужно добавить еще одно событие например onmouseout в строках:
 f.innerHTML = '<img src="images/x.png" height="13" width="13" border="0" id="x_image" '+

'style="cursor:pointer;float:right;" onclick="hide();">'+
'<div style="padding: 10px">' +
document.getElementById(id).innerHTML + '</div>';

чтобы получилось:
 f.innerHTML = '<img src="images/x.png" height="13" width="13" border="0" id="x_image" '+

'style="cursor:pointer;float:right;" onclick="hide();" onmouseout="hide();">'+
'<div style="padding: 10px">' +
document.getElementById(id).innerHTML + '</div>';


Если закрытие картинки нужно не сразу, а с таймаутом обработчик нужно передать не на hide(), а на свою функцию которая вызовет hide с задержкой через setInterval.

Еще лучше начать использовать какой-то фреймворк где уже готовые абстракции. Например jquery.

Спасибо за подсказку, но это действует только если навести мышь на кнопку закрытия (маленький крестик в правом углу) и если убрать мышь с нее то окно закроется. Мне бы функцию закрытия окна (div) если мышь кликает вне его пределов.

LS
На сайте с 08.10.2011
Offline
4
#3

Не видя html достаточно трудно подсказать обработчик.

Можно попробовать повесить обработчик на body или div

примерно так <body onclick="hide()">.

Еще раз акцентирую внимание на фреймворках, может для ваших целей подойдет fancybox?

http://fancybox.net/ - примеры чуть ниже на главной

T
На сайте с 21.07.2008
Offline
43
#4
LazySeo:
Не видя html достаточно трудно подсказать обработчик.
Можно попробовать повесить обработчик на body или div
примерно так <body onclick="hide()">.

Еще раз акцентирую внимание на фреймворках, может для ваших целей подойдет fancybox?
http://fancybox.net/ - примеры чуть ниже на главной

http://pers.narod.ru/jscript/js_popup_help.html вот он.

За <body onclick="hide()"> спасибо, то что нужно

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий