хром. на ie у меня нет возможности на линуксе проверить
Вот разметка в сокращенном виде: <div id="toppanel" tabindex="-1"> <div id="panel"> <div class="content_panel clearfix_panel"> <input type='text' id='fld1' size='10' name='req_username' value=''> <input type='password' id='fld2' size='10' name='req_password' value=''> </div> </div> <div class="login_tab"> <span id="toggle"> <a id="open" class="open">Открыть панель</a> <a id="close" style="display: none;" class="close">Закрыть панель</a> </span> </div> </div> |
ну в хроме мой пример работает, в IE несколько другое восприятие nextSibling (решаемо)
|
а ну я понял, попробуйте так
function Focus_and_Blur(opt){
var elem = opt.elem, focusForElem;
var body = document.body;
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) {
focusForElem = false;
opt.blur.call(elem,e)
}
}
};
|
даже панель просто не открывается
|
<!DOCTYPE HTML>
<html>
<head>
<style>
#toppanel {
position:fixed;
z-index: 999;
margin:0px;}
#toppanel a {cursor:pointer;}
#toppanel:focus {outline: none;}
#panel {
position: relative;
z-index: 3;
display: none;}
#toppanel .login_tab {
position: relative;
top: 0;
z-index: 999;}
</style>
</head>
<body>
<div id="toppanel" tabindex="-1">
<div id="panel">
<div class="content_panel clearfix_panel">
<input type='text' id='fld1' size='10' name='req_username' value=''>
<input type='password' id='fld2' size='10' name='req_password' value=''>
</div>
</div>
<div class="login_tab">
<span id="toggle">
<a id="open" class="open">Открыть панель</a>
<a id="close" style="display: none;" class="close">Закрыть панель</a>
</span>
</div>
</div>
<script>
function Focus_and_Blur(opt){
var elem = opt.elem, focusForElem;
var body = document.body;
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) {
focusForElem = false;
opt.blur.call(elem,e)
}
}
};
Focus_and_Blur({
elem:document.getElementById('toppanel'),
focus:function () {
$("div#panel").slideDown("slow");
$("#toggle a").toggle();},
blur: function () {
$("div#panel").slideUp("slow");
$("#toggle a").toggle();},}
});
</script>
</body>
</html>
|
хех, а вы функцию вызывать не пробывали?:lol:
|
Цитата:
$(document).ready(function() {...
:) |
а в примере выше?
|
Отредактировал предыдущий. Не работает. Или я чего забыл?:blink:
|
короче я понял в чем прикол, когда вернусь с треши покажу, если не засну:)
|
Видимо проблема в том, что у меня инпуты находятся в одном контейнере (#panel), кнопки открыть/закрыть - в другом (.login_tab), оба они находятся в #toppanel, в котором при событий $('#toppanel').blur должен закрываться контейнер находящийся в нем (#panel), а не сам #toppanel
|
zevilz, чет я забыл про вас=)
<!DOCTYPE HTML>
<html>
<head>
<style>
#block {
width:200px;
height:200px;
border:4px solid red;
display:none;
}
body {
border:2px solid black;
}
</style>
</head>
<body tabindex='-1'>
<div tabindex='-1' id='block'>
wereasrwer
<input type='text'>
<div>
<input type='text'>
</div>
</div>
<div id='inform'></div><br/>
<a href='#' id='open'>open/close</a>
<br><input type='text'>
<script>
function _(selector) {//функия для удобства написания примера, копипастить не нужно:)
return document.querySelectorAll(selector)[0];
}
function Focus_and_Blur(opt){
var elem = opt.elem, focusForElem;
if (elem.addEventListener){
elem.addEventListener('focus' , onFocus,true);
document.addEventListener('focus',onDocumentFocus,true);
} else {
elem.onfocusin = onFocus;
document.onfocusin = onDocumentFocus;
}
function onFocus(e) {
focusForElem = true;
event.cancelBubble = true;
opt.focus.call(this,e);
}
function onDocumentFocus (e) {
if (focusForElem) {
focusForElem = false;
opt.blur.call(elem,e)
}
}
};
//пример вызова, в саму функцию лучше не лезть
Focus_and_Blur({
elem:_('#block'),
focus:function () {
_("#inform").innerHTML = 'focus on '+ this.id;
},
blur: function () {
_("#inform").innerHTML = 'blur '+ this.id;
_('#block').style.display = 'none';
}
});
_('#open').onclick = function () {
_('#block').style.display = 'block';
_('#block').focus();// ставим фокус на блок
return false;
}
</script>
</body>
</html>
вот |
Что-то не хочет открываться
<!DOCTYPE HTML>
<html>
<head>
<style>
#toppanel {
position:fixed;
z-index: 999;
margin:0px;}
#toppanel a {cursor:pointer;}
#toppanel:focus {outline: none;}
#panel {
position: relative;
z-index: 3;
display: none;}
#toppanel .login_tab {
position: relative;
top: 0;
z-index: 999;}
</style>
</head>
<body>
<div id="toppanel" tabindex="-1">
<div id="panel">
<div class="content_panel clearfix_panel">
<input type='text' id='fld1' size='10' name='req_username' value=''>
<input type='password' id='fld2' size='10' name='req_password' value=''>
</div>
</div>
<div class="login_tab">
<span id="toggle">
<a id="open" class="open">Открыть панель</a>
<a id="close" style="display: none;" class="close">Закрыть панель</a>
</span>
</div>
</div>
<script>
function _(selector) {//функия для удобства написания примера, копипастить не нужно:)
return document.querySelectorAll(selector)[0];
}
function Focus_and_Blur(opt){
var elem = opt.elem, focusForElem;
if (elem.addEventListener){
elem.addEventListener('focus' , onFocus,true);
document.addEventListener('focus',onDocumentFocus,true);
} else {
elem.onfocusin = onFocus;
document.onfocusin = onDocumentFocus;
}
function onFocus(e) {
focusForElem = true;
event.cancelBubble = true;
opt.focus.call(this,e);
}
function onDocumentFocus (e) {
if (focusForElem) {
focusForElem = false;
opt.blur.call(elem,e)
}
}
};
//пример вызова, в саму функцию лучше не лезть
Focus_and_Blur({
elem:_('#panel'),
focus:function () {
// $("#toggle a").toggle();
},
blur: function () {
// $("#toggle a").toggle();
$("div#panel").slideUp("slow");
// _('#panel').style.display = 'none';
}
});
_('#open').onclick = function () { $("div#panel").slideDown("slow");
$("#toggle a").toggle();
_('#panel').style.display = 'block';
_('#panel').focus();// ставим фокус на блок
return false;}
_('#close').onclick = function () { $("div#panel").slideUp("slow");
$("#toggle a").toggle();
// _('#panel').style.display = 'none';
// _('#panel').blur();// ставим фокус на блок
return false;}
</script>
</body>
</html>
|
оно и не должно работать, потому что нужно либо копировать полностью с функцией
function _(selector) {//функия для удобства написания примера, копипастить не нужно:)
return document.querySelectorAll(selector)[0];
}
либо ее не использовать |
В посте выше изменил код - не открывается.
На сайте http://yellow-duck.net/ с тем же самым кодом открывается, закрывается. Но по blur не закрывается. Выделяется только один из инпутов. При выделении второго панель закрывается и при этом не работает toggle |
если честно то не знаю у вас там такая камасутра получилась из за пери мешки чистого js и jquery..
|
Может легче будет мой переделать?
$(document).ready(function() {
// Сворачиваем панель
$("#close").click(function(){
$("div#panel").slideUp("slow");
});
// Сворачиваем панель при снятии фокуса
$("#toppanel").blur(function(){
$("div#panel").slideUp("slow");
$("#toggle a").toggle();
});
// Разворачиваем панель
$("#open").click(function(){
$("div#panel").slideDown("slow");
});
// Переключаем кнопки "Войти | Регистрация" на "Закрыть панель" при нажатии кнопки мыши
$("#toggle a").click(function () {
$("#toggle a").toggle();
});
});
а именно в:
// Сворачиваем панель при снятии фокуса
$("#toppanel").blur(function(){...}
реально засунуть условие что-нибудь типа такого
if ("#toppanel input:focus") {$("div#panel").slideUp("slow");
$("#toggle a").toggle();}
else {}
? |
не, я ненавижу jquery особенно после моего прошлого проекта.
Могу расписать алгоритм как у меня работает а вы уже сами переделаете |
А от чего такая ненависть? можно и как у вас
|
не знаю просто не люблю я jquery.
Алгоритм: -ставим событие focus(у меня стоит focus для норм браузеров и focusin для тех которые не поддерживают addEventListener) на element и на body -при получение фокуса элементом , переменная focusForElem ставится в true -при получение фокуса на body проверяется focusForElem если true то значить фокус ушел с element |
Принцип понял, но не понял как сделать. Переделал свой скрипт:
$(document).ready(function() {
// Сворачиваем панель
$("#close").click(function(){
$("div#panel").slideUp("slow");
$("#toggle a").toggle();
});
// Сворачиваем панель при снятии фокуса с #toppanel
$("#toppanel").blur(function(){
$("*").not("#panel input").focus(function(){
$("div#panel").slideUp("slow");
$("#toggle a").toggle();
});
});
// Сворачиваем панель при снятии фокуса с input
$("#toppanel input").blur(function(){
$("*").not("#panel input").focus(function(){
$("div#panel").slideUp("slow");
$("#toggle a").toggle();
});
});
// Разворачиваем панель
$("#open").click(function(){
$("div#panel").slideDown("slow");
$("#toggle a").toggle();
});
});
Сдесь добавил следующее: 1.При снятии фокуса с панели панель сворачивается. Но только если фокус получает не input на этой панели. На панели 4 инпута: для логина, пароля, чекбокс и submit. 2. При снятии фокуса с любого инпута панель сворачивается. Но если фокус получает не другой инпут на этой панели. При снятии фокуса с панели она закрывается нормально, кнопка закрытия меняет свое содержимое. Но при повторном открытии при первом и втором клике выполняется только $("#toggle a").toggle();. И только при третьем клике панель открывается. То же самое происходит и при снятии фокуса с инпутов. И заметил еще косяк: если после фокуса на инпутах кликнуть на чекбокс, то панель закроется, а если наоборот, то панель не закроется. Может кто вкурсе, почему происходит такая хрень и как исправить? |
Цитата:
Цитата:
return document.querySelector(selector); |
Цитата:
и этот коммент там не зря! Цитата:
|
Цитата:
Короче решение |
я ничего там переделывать не буду. Заново не хочется скрипт писать. А мой работает, но с небольшими косяками. Мне всего лишь надо как то их исправить
|
я сказал, а вы как хотите (мне все равно!)
|
Если следующее в консоли
$("a#open:visible");
выдает пустой результат [], то как это прописать в условии вместо звездочек:
if ("a#open:visible" == ***) {}
?"", "[]", null, false не срабатывают |
if ( $("a#open:visible").length === 0 ) {}
|
Цитата:
|
Цитата:
|
Цитата:
UPD: var str = '0'; alert((str == 0) + '; ' + (str === 0)); разницу в алгоритмах см. в спецификации п. 11.9.1- 11.9.6 http://es5.javascript.ru/x11.html#x11.9.3 http://es5.javascript.ru/x11.html#x11.9.6 UPD:cyber, typeof($("a#open:visible").length) покажет правду |
Цитата:
|
у меня и 2 и 3 нормально работают:)
|
<!DOCTYPE HTML>
<html>
<head>
<style>
body, #main_wrap {width:100%; margin:0; height:200px; border:1px solid grey;}
#toppanel {
width:100%;
position:fixed;
z-index: 999;
margin:0px;}
#toppanel a {cursor:pointer;}
#toppanel:focus {outline: none;}
#panel {
height:50px;
padding:10px;
background-color:#ddd;
position: relative;
z-index: 3;
display: none;}
#toppanel .login_tab {
position: relative;
top: 0;
z-index: 999;}
</style>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.1/jquery.min.js"></script>
</head>
<body>
<div id="toppanel">
<div id="panel">
<div class="content_panel clearfix_panel">
<input type='text' id='fld1' size='10' name='req_username' value=''>
<input type='password' id='fld2' size='10' name='req_password' value=''>
</div>
</div>
<div class="login_tab">
<span id="toggle">
<a id="open" class="open">Открыть панель</a>
<a id="close" style="display: none;" class="close">Закрыть панель</a>
</span>
</div>
</div>
<div id="main_wrap"><p style="font-size:100px; margin:0; text-align:center;">Контент</p></div>
<script>
$(document).ready(function() {
// Сворачиваем панель
$("#close").click(function(){
$("div#panel").slideUp("slow");
$("#toggle a").toggle();
});
// Сворачиваем при клике на области вне панели
$("#main_wrap").click(function(){
if ($("a#open:visible").length === 0) {
$("div#panel").slideUp("slow");
$("#toggle a").toggle();
}
});
// Разворачиваем панель
$("#open").click(function(){
$("div#panel").slideDown("slow");
$("#toggle a").toggle();
});
});
</script>
</body>
</html>
|
| Часовой пояс GMT +3, время: 21:02. |