Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Игнорирование дочерних объектов на событие (https://javascript.ru/forum/events/31468-ignorirovanie-dochernikh-obektov-na-sobytie.html)

kingrus 09.09.2012 12:04

Игнорирование дочерних объектов на событие
 
Добрый день. Столкнулся с не большой проблемой, но решить ее сам так и не смог.

Ситуация следующая: есть меню, при наведении на меню создается <div id='abc'> (принадлежащий body, position absolute), в котором выводим подменю (<ul>...</ul>). Навели мышкой - создался див - показал меню, теперь его нужно закрыть. Закрыть нужно по onmouseout='close(this/this.id)', при условии, если мы вытащим мышку из этого дива 'abc'. Но проблема встает, тогда, когда мы наводим на созданный в этом диве <ul></ul> - блок сразу закрывается (хотя нам нужно этим <ul></ul> пользоваться). Если мышой обходить <ul></ul> внутри созданного дива, а потом выйти мышой из дива - все в порядке, закрывается как и нужно. Но если на вести на <ul> - тут же закрывается. Задача игнорить не нужные события, что находится в этом диве, кроме самого дива.

Пробовал следующие и не помогло :
функция закрытия дива(abc) {
if (<ul>){вернуть фалсе}
елсе {
закрыть abc;
}
}
<ul onmouseout='return false;'>
див.присвоитьДочь(<ul>)
z-index:99 / - 99

Думаю, что задача не сложная для того, кто с этим сталкивался!
Буду заранее благодарен в помощи.

cyber 09.09.2012 12:31

function hover (opt) {
	
 opt.elem.onmouseover = ElemMouseAction;	 
 opt.elem.onmouseout = ElemMouseAction;
 	
 function ElemMouseAction (evt) {
  var related, Call;
  var e = evt || event;	 
 
	if(e.type == 'mouseover'){  
	  Call = opt.over; 
	  related = e.relatedTarget || e.fromElement;
	  
	} else {
	  Call = opt.out; 
	  related =  e.relatedTarget || e.toElement;
	  
		}
		
			
	while (related && related != this) {
		related = related.parentNode;
		} 
	  
	  if(related == this) return;
	 
	  Call();
	 
	 }	

	
	}
	
hover({
	elem:document.getElementById('#bla'),
	over:function () {// срабатывает при mouseover
		
		},
	out:function (){// срабатывает при mouseout
		
		}	
	
	});

kingrus 09.09.2012 13:46

Цитата:

Сообщение от cyber
03 opt.elem.onmouseover = ElemMouseAction;
04 opt.elem.onmouseout = ElemMouseAction;

Сразу же на это идет ругня baga
Мб я не так, что делаю...
если можно коммент напишите на "function hover (opt)" и function ElemMouseAction (evt) без коммента тяжко разобрать

kingrus 09.09.2012 13:56

неужели нет выхода попроще?)

cyber 09.09.2012 14:14

функцию писал для себя и поправил интерфейс (упростил) когда заливал на форум, поправил прям в форме коммента, щас гляну где ступил

cyber 09.09.2012 14:20

ошибка тут
document.getElementById('#bla')
по привычке написал с решеткой (обычно использую querySelectorAll).
пример:
<!DOCTYPE HTML>
<html>
  <head>
 <style>
   
   #bla {
     width:200px;
     height:200px;
     border:5px solid black;
   
   
   }
   
    </style>
  </head>
  <body>
    <div id='bla'>
   
    </div>
    <script>
function hover (opt) {
	
 opt.elem.onmouseover = ElemMouseAction;	 
 opt.elem.onmouseout = ElemMouseAction;
 	
 function ElemMouseAction (evt) {
  var related, Call;
  var e = evt || event;	 
 
	if(e.type == 'mouseover'){  
	  Call = opt.over; 
	  related = e.relatedTarget || e.fromElement;
	  
	} else {
	  Call = opt.out; 
	  related =  e.relatedTarget || e.toElement;
	  
		}
		
			
	while (related && related != this) {
		related = related.parentNode;
		} 
	  
	  if(related == this) return;
	 
	  Call();
	 
	 }	

	
	}
	
hover({
	elem:document.getElementById('bla'),
	over:function () {// срабатывает при mouseover
	alert('over');	
		},
	out:function (){// срабатывает при mouseout
		
      alert('out');
		}	
	
	});



    </script>

  </body>
</html>

Цитата:

Сообщение от kingrus (Сообщение 203758)
неужели нет выхода попроще?)

и так просто вариант.

Цитата:

Сообщение от kingrus (Сообщение 203756)
Сразу же на это идет ругня baga
Мб я не так, что делаю...
если можно коммент напишите на "function hover (opt)" и function ElemMouseAction (evt) без коммента тяжко разобрать

в нутрь если не знаешь тут лучше не лезть можно запутаться тут
if(e.type == 'mouseover'){  
	  Call = opt.over; 
	  related = e.relatedTarget || e.fromElement;
	  
	} else {
	  Call = opt.out; 
	  related =  e.relatedTarget || e.toElement;
	  
		}

просто передаете элемента , и функцию которая выполняется при over и out.

kingrus 09.09.2012 14:21

просто для примера - в итоге я хочу поулчить меню amazon.com , т.е. при наведении (или клике) на меню создается блок с выводом подменю и прочей ерундой (при этом меню в созданном блоке активное), но при выводи мыши из блока - блок удаляется.

kingrus 09.09.2012 14:22

я даже на джикверный # внимание не обратил... (

cyber 09.09.2012 14:31

Цитата:

Сообщение от kingrus (Сообщение 203764)
просто для примера - в итоге я хочу поулчить меню amazon.com , т.е. при наведении (или клике) на меню создается блок с выводом подменю и прочей ерундой (при этом меню в созданном блоке активное), но при выводи мыши из блока - блок удаляется.

для меню лучше css
Цитата:

Сообщение от kingrus (Сообщение 203765)
я даже на джикверный # внимание не обратил... (

а не это не jquer, это чистый js просто jquery использует document.querySelectorAll(selector) ...

kingrus 09.09.2012 14:42

я имел ввиду $('#bla').....


Часовой пояс GMT +3, время: 00:03.