mouseover, mouseout - не распространяется на дочерние элементы
Штука такая:
<div style="display:inline" id="myDiv">Some Text<span style="display:none"><select..></select></div>
Event.observe('myDiv', 'mouseover', this.onIn.bindAsEventListener(this));
Event.observe(this.container, 'mouseout', this.onOut.bindAsEventListener(this));
так вот в чём проблема - при наведении на текст(some text) отрабатывает mouseover - там я показываю внутренний скрытый span. Но когда я мышь увожу на этот select в спане - срабатывает mouseout!! В в3ц вроде пишет, что он mouseover, mouseout распространяется на все дочерние элементы. Собсна хотелось-бы понять, почему так и что происходит. Если событие вешается на все дочерние - то получается отрабатывает mouseout с textNode - some text что-ли? |
Во-первых ты не закрыл спан, во вторых ты пользуешся фремворком. w3c за фреймворки не отвечает...
|
ну спан - это я тут накидал. ща разобрался - и over & out всплывают на всех дочерних. но ёлки, в диве находится селект - я на селект навожу - всплывает mouseout на диве - почему, ведь селект внутри дива. и как отследить уход из div-a и всего его содержимого?
|
в браузерах (в ФФ точно) есть баги: при переходе границы елементов может всплывать аут. Так что надо писать функции с таймером: на аут ставить таймер, а на овер - отменять.
|
ZoNT,
Разве это баги? Это стандартное всплывание события. |
вообщем-то я оставил как есть - при переходе внутри элемента к другому элементу - сначала аут срабатывает и сразу-же over над внутренним элементом - т.е. при движении он прячется и тут-же показывается - вроде не мерцает
|
Цитата:
|
Люди !!!! Как хорошо, что я на Вас напал .... У меня происходит примерно такая же фигня:
есть несколько вложенных друг в друга div, два из них наложенные с разными z-index для создания меню. Стоят обработчики события onmouseover и onmouseout. И вот что диагностикой обнаружено: цвет иконки путем сокрытия иконки меняется (иконки для того, чтобы все было видно нормально при любых условиях); вначале срабатывает onmouseover (вроде все нормально, - так и должно быть), а затем сразу же срабатывает onmouseout и этим все заканчивается. И еще: не могу поймать разницу между выходом из меню вообще (чтобы закрыть все дочерние окна) и в родительское, чтобы закрыть исходное .... Будьте добры, разъясните непонятливому (желательно на уровне детского сада) в чем моя ошибка и как ее исправить ... С уважением, Дмитрий P.S. Лучше продублировать мне на почту, чтобы всем было хорошо (мало ли потеряю адрес). |
Цитата:
Цитата:
Я склонен относить подобное поведение к глюку, но хочу разобраться окончательно чтобы точно знать. |
это не глюк .дело в том что при вложенных элементах возникает событие оут у родительского при переходе на дочерний. но за счёт того что у вас обработчик на родительском и идёт всплытие -события генерируются в такой последовательности оут-всплытие события-овер.и почему пропускается оут в других браузерах это странно ,объяснение вижу только одно-вложенный контейнер пустой -а при пустых контейнерах событие как бы проваливается в нижний заполненный.и не важно родительский он или просто подложенный.прозрачность ему чуть поменяйте и проваливание отпадёт или бекграунд ему задайте
|
dmitriymar,
Спасибо за подробное разьяснение! |
Рассмотрел всплывающие события подробно. Имея родительский элемент и в нём другой элемент последовательность возникновения событий следующая. 1 - элемент родителя, 2 - вложенный элемент. Out - событие onmouseOUT. Over - событие onmouseOVER.
///////// out 1 over 2 over 1 out 2 out 1 over 1 ///////// Данная последовательность событий происходит при введении курсора в дочерний элемент и выведении его от туда, при этом не выходя за пределы родительского элемента. И изначально находясь в нём. Надеюсь это достаточно наглядно. Мне посоветовали воспользоваться stopPropagation(); не разобравшись как он работает я накрутил безумное но действенное решение. Решение приблизительно такое.
<div id="div1" onmouseover="over1();" onmouseout="out1();setTimeout ('function forDiv1Out()',10)" >
<div id="div2" onmouseover="over2();" onmouseout="out2();"></div>
</div>
var check = 0;
var check2 = 0;
function out1(){check= 0}
function out2(){check2= 0}
function over1(){check= 1}
function over2(){check2= 1}
function forDiv1Out(){
if (check==0 && check2==0){
/*codeHere*/}
};
Но это очень криворуко, так делать не стоит. Если вам нужна функция именно на вывод из родительского дива, то можно потереть функции out2() и over2(). Так же ликвидировать переменную chek2. |
Всем привет!
Тут такое дело, в инете пишут, что mouseenter не учитывает переходы внутри элементов. Но вот у меня почему-то учитывает. Что я могу не правильно делать? Код самый простой, но работает не как нужно..
$('.mini-basket').on('mouseenter',function() {
$('.mini-basket-layer').css('visibility', 'visible');
});
$('.mini-basket').on('mouseleave',function() {
$('.mini-basket-layer').css('visibility', 'hidden');
});
|
Цитата:
|
все работает как часы =)
<!DOCTYPE HTML>
<html lang="en">
<head>
<meta charset="utf-8">
</head>
<body>
<div class="mini-basket" style="display:inline-block; width: 100px; height: 100px; border: 1px solid grey;"></div>
<div class="mini-basket-layer" style="display: inline-block; width: 100px; height: 100px; border: 1px solid grey;"></div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script>
$('.mini-basket').on('mouseenter',function() {
$('.mini-basket-layer').css('visibility', 'visible');
});
$('.mini-basket').on('mouseleave',function() {
$('.mini-basket-layer').css('visibility', 'hidden');
});
</script>
</body>
</html>
|
Цитата:
Ребята, извиняюсь, думал проблема в mouseleave, а проблема оказалась в другом. Может тогда кто знает, возможно ли сделать так, т.к. мне кажется, что невозможно: Есть элемент, при наведении на него должен появиться выпадающий блок и layer под ним. И, соответственно, когда уводишь мышь с этого элемента layer и блок должны исчезнуть. Собственно проблема в layer, как только он появляется hover и mouseenter спадают.
<!DOCTYPE HTML>
<html lang="en">
<head>
<meta charset="utf-8">
</head>
<body>
<div id="site">
<header id="header">
<div class="mini-basket" style="width: 100px; height: 100px; border: 1px solid grey;"></div>
</header>
</div>
<div class="layer" style="position: fixed; top: 0; left: 0; width: 100%; height: 100%; z-index: 1; background-color: rgba(0,0,0,0.2); visibility: hidden;"></div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script>
$('.mini-basket').on('mouseenter',function() {
$('.layer').css('visibility', 'visible');
});
$('.mini-basket').on('mouseleave',function() {
$('.layer').css('visibility', 'hidden');
});
</script>
</body>
</html>
|
mcreature, где твой пример?
Пока только рассказы... :D |
Цитата:
|
Цитата:
Что ты ожидаешь получить в своем примере? И чего не получаешь? |
z-index: -1 и все заиграет!
|
Цитата:
https://learn.javascript.ru/mousemov...потомка |
Цитата:
Самое главное: собственно проблема в layer, как только он появляется hover и mouseenter с элемента спадают. j0hnik, тогда элемент будет над layer, что не годится. ksa, как раз там и написано. "Не учитываются переходы внутри элемента." |
значит вешайте и на layer те же события!
|
Цитата:
|
$('.mini-basket, .layer ')как-то так
|
Цитата:
|
Цитата:
|
этот .layer типа оверлея? тогда сделайте его псевдоэлементом
или сделайте нормальный пример чтобы было понятно! |
Цитата:
Т.е. при наведении на корзину должен появиться оверлей и поверх него выпадающий блок. Ссылка в личке. |
Цитата:
|
Цитата:
В любом случае спасибо. |
Цитата:
Вот пример.
<!DOCTYPE html>
<html>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=windows-1251' />
<script src='https://code.jquery.com/jquery-latest.js'></script>
<!--
<script src="https://code.angularjs.org/1.3.9/angular.min.js"></script>
<script src="https://code.angularjs.org/1.3.9/angular-route.js"></script>
-->
<style type='text/css'>
#box {
width: 100px;
height: 100px;
display: flex;
justify-content: center;
align-items: center;
background-color: blue;
}
#test {
width: 50%;
height: 50%;
background-color: red;
}
.off {
display: none;
}
</style>
<script type='text/javascript'>
$(function(){
$('#box').on('mouseenter',function() {
$('#on').show();
$('#off').hide();
}).on('mouseleave',function() {
$('#off').show();
$('#on').hide();
});
});
</script>
</head>
<body>
<div id='box'>
<div id='test'></div>
</div>
<div id='on' class='off'>On</div>
<div id='off' class='off'>Off</div>
</body>
</html>
Ни чего не теряется и не пропадает... |
| Часовой пояс GMT +3, время: 11:50. |