div и onblur
Есть окно которое появляется при onclik в input. Окно представляет собой таблицу с кучей кнопок и текста. Как сделать так чтобы при клике вне таблице она исчезала(удалялась). Примерно так работает datapicker в jquery.
Я перепробывал много вариантов но все они работали по разному в разных браузерах. Кто как справляется с такой проблемой? P.S. В названии темы стоит div для понятности. Я могу обернуть table в div, сути дела не меняет. |
способы разные, мне нравится накрыть всё прозрачным (или не очень) div-ом, по клику на него скрывать
|
Впринципе интересный способ.Я даже когда то такой пробовал - проблема только была с высотой этого прозрачного дива, если страница была больше экрана. Но мне в данном случае не подойдёт.
|
position: fixed; height: 100%; width: 100%; z-index: 100;
у окна соответственно z-index больше |
Когда я делал заливку экрана то height: 100% довало заливку экрана, а размер страницы увеличевался посредством ajax. Поэтому надо было вычеслять реальный размер текущего экрана. Каждый браузер это делал по разному. Вобщем как всегдаобычный геморой на пустом иесте. Нюансов я не помню давно было. Но мне сейчас такой подход не подходит.
Пока делаю на лютых граблях. Примерно так:
function hide_all(ev) {
var tgt = window.event ? window.event.srcElement : ev.target;
if (tgt.parentNode.className !== "cd_tbl") {
input.parentNode.removeChild(cd_table);
document.onclick = ''
}
}
document.onclick = hide_all;
где cd_table - таблица input - input при клике по каторому создаётся таблица. эта функция вызывается в конце создания таблици Вылез очередной геморой - какогото hide_all вызывается сразу и при этом объект который вызвал onclick это input Сейчас ищу как обнулить onclick перед строчкой document.onclick = hide_all но походу такого понятия в javascript нету. |
моя реализация blur && focus
<!DOCTYPE HTML>
<html>
<head>
<style>
#block {
width:200px;
height:200px;
border:4px solid red;
display:none;
}
body {
border:2px solid black;
}
</style>
</head>
<body >
<a href='#' id='action' >open/close</a>
<div id='block'>
wereasrwer
<input type='text'>
<div>
<input type='text'>
</div>
</div>
<div id='inform'></div>
<script>
function _(selector) {//функия для удобства написания примера, копипастить не нужно:)
return document.querySelectorAll(selector)[0];
}
function Focus_and_Blur(opt){
var elem = opt.elem, focusForElem;
var body = document.body;
elem.setAttribute('tabindex',-1);
body.setAttribute('tabindex',-1);
if (elem.addEventListener){
elem.addEventListener('focus' , onFocus,true);
body.addEventListener('focus',onDocumentFocus,true);
} else {
elem.onfocusin = onFocus;
body.onfocusin = onDocumentFocus;
}
function onFocus(e) {
focusForElem = true;
event.cancelBubble = true;
opt.focus.call(this,e);
}
function onDocumentFocus (e) {
if (focusForElem) {
if(parent(e))return;
focusForElem = false;
opt.blur.call(elem,e)
}
}
function parent (e) {
var target = e.target || event.scrElement;
var parent = target;
while (parent && parent != elem) {
parent = parent.parentNode;
}
return parent == elem;
}
};
var elem = document.getElementById('block');
Focus_and_Blur({
elem:elem,
focus:function (e) {
_("#inform").innerHTML = 'focus on '+ this.id;
},
blur: function (e) {
_("#inform").innerHTML = 'blur '+ this.id;
elem.style.display = '';
}
});
_("#action").onclick = function () {
elem.style.display = 'block';
elem.focus();
}
</script>
</body>
</html>
|
Цитата:
второй способ: вешать обработчик клика на body, но отсекать те из них, которые идут от таблицы и её дочерних элементов |
| Часовой пояс GMT +3, время: 14:31. |