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').....

kingrus 09.09.2012 14:46

Опять трудность, на созданном диве работает. Но у меня див создается при событии, попробуй в свой код, в начало добавь вот это
window.onload = function(){
		var div = document.createElement('div');
		div.setAttribute('id','bla');
		document.body.appendChild(div);
		}

и уже не работает...
до hover({.... я уже пробовал существование if(document.getElementById('bla')) - не помогло

kingrus 09.09.2012 14:48

как раз у меня поэтому ошибка и вылазила... так как он дива того не видит

cyber 09.09.2012 14:52

в jquery уже есть метод hover он встроенный используйте его

cyber 09.09.2012 14:59

все работает
<!DOCTYPE HTML>
<html>
  <head>
  <style>
    .d{
      width:200px;
      height:200px;
      border:3px solid black;
    
    
    }
    
    
    
    </style>
  </head>
  <body>
    <a href='#' id='create'>create</a>
    
    <script>
      function _(selector) {
      
      return document.querySelectorAll(selector)[0];
      }

      
      _('#create').onclick = createElement;
      
        function createElement(){
         var div = document.createElement('div');
          div.className='d';
          
          document.body.appendChild(div);
          hover({
            elem:div,
            over:function (){
            
            alert('over');
            },
            
            out:function () {
            
            
            alert('out');
            }
          
          })
        
         return false;
        };
      
      
           
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();
	 
	 }	

	
	}
	

    </script>

  </body>
</html>

kingrus 09.09.2012 15:14

Спасибо огромное за такую помощь!
Все заработало просто я
hover({
	elem:document.getElementById('bla'),
	over:function () {// срабатывает при mouseover
	alert('over');	
		},
	out:function (){// срабатывает при mouseout
		
      alert('out');
		}	
	
	});

добавил в саму функцию, которая и создает див. Все отлично. Только теперь разберу, что к чему, до конца.
Еще раз спасибо!)

kingrus 09.09.2012 15:14

обошелся без jqvery

cyber 09.09.2012 15:32

если нужна поддержка ие меньше 8 , функцию
function _(selector) {
      
      return document.querySelectorAll(selector)[0];
      }

не используйте

kingrus 09.09.2012 15:42

я думаю, < 8 не будет, спасибо)

cyber 09.09.2012 15:47

ну тогда тут описано как работает этот метод http://learn.javascript.ru/searching...electorall-css


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