Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Выпадающее меню(неправильно назначает обработчик события) (https://javascript.ru/forum/dom-window/4625-vypadayushhee-menyu-nepravilno-naznachaet-obrabotchik-sobytiya.html)

Fliand 09.08.2009 13:54

Выпадающее меню(неправильно назначает обработчик события)
 
Вот хочу написать выпадющее меню без jquery, чтоб меню не сразу скрывалось, а через промежуток времени.
Хочу чтоб все выглядело так:
1)Функция search_elem, искала элементы LI, у которых присутствует узел UL, и вызывала функцию assign_event
2)Функция assign_event - эта функция должна вешать обработчик события на элементы и останавливать всплытие(вызовом функции stop_bubbling).
3)Функция stop_bubbling, думаю здесь все понятно.

Вот начал писать код, и столкнулся с проблемой. Почему-то функция assign_event, вешает события не только на нужный элемент, но и на всех его потомков, я никак немогу это прекратить, всплытие получается убирать, а это нет.

По идеи при наведение в моем коде на элемент имеющий потомка ul, должно появляться сообщение (alert). Но оно появляется на всех.

Вот код:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<title>Menu</title>
<script type="text/javascript">

[JS]var menu_id = "navbar";

var speed_show = 50;
var speed_hide = 1000;

function search_elem() {
	var elem = document.getElementById(menu_id).getElementsByTagName("li");
	
	for(i in elem) {
		var list = elem[i].childNodes;
		
		//alert(elem[i].nodeName);
		
		for(a in list) {
			if(list[a].nodeName == "UL") {
				//alert(list[a].nodeName);
				assign_event(elem[i], list[a]);
			}
		}
	}
}

function assign_event(elem, list) {
	elem.onmouseover = function() {
		//alert(list.nodeName);
		//list.style.display = "block";
		
		alert("yes");
		stop_bubbling();
	}
		
	//elem.onmouseout = start_hide;
}



function stop_bubbling(event) {
    event = event || window.event;
 
    if (event.stopPropagation) event.stopPropagation();
    else event.cancelBubble = true;
}

onload = search_elem;
[/JS]
</script>

<style type="text/css">
#navbar, #navbar ul {
	margin: 0px;
	padding: 0px;
	list-style-type: none;
}
#navbar li {
	float: left;
}
#navbar a {
	background: #999999;
	color: #FFFFFF;
	display: block;
	font: 11px Verdana, Arial, Helvetica, sans-serif;
	text-decoration: none;
	padding: 5px;
	cursor: pointer;
}
#navbar a:hover { 
	color: #E2144A;
	background: #CCCCCC; 
}
/*styles for sub-navbar*/ 
#navbar ul {
	display: block;
	position: absolute;
	width: 150px;
	margin: 0px;
	padding: 0px;
	list-style-type: none;
}
#navbar ul li {
	float: none;
}
#navbar ul a {
	background: #666666;
	padding: 3px;
}
#navbar ul ul {
	margin-top: -19px;
	margin-left: 150px;
}
</style>
</head>
<body>
<div>
<ul id="navbar">
  <li><a hover="#">home</a></li>
  <li><a hover="#">service</a>
    <ul>
      <li><a href="#">php</a></li>
      <li><a href="#">java script</a>
        <ul>
          <li><a href="#">jQuery</a></li>
          <li><a href="#">asp.net</a>
            <ul>
              <li><a hover="#">web-design</a></li>
              <li><a hover="#">web-codding</a></li>
            </ul>
          </li>
        </ul>
      </li>
      <li><a href="#">jsp</a></li>
      <li><a href="#">xhtml</a></li>
    </ul></li>
  <li><a hover="#">buy</a></li>
  <li><a hover="#">about us</a></li>
  <li><a hover="#">contacts</a></li>
</ul>
</div>

Андрей Параничев 09.08.2009 15:17

Не уверен, что не работает из-за этого, но вы не передаете объект события в вашу функцию stop_bubbling():
function assign_event(elem, list) {
    elem.onmouseover = function(e) {
        //alert(list.nodeName);
        //list.style.display = "block";
 
        alert("yes");
        stop_bubbling(e);
    }
 
    //elem.onmouseout = start_hide;
}
 
 
 
function stop_bubbling(event) {
    event = event || window.event;
 
    if (event.stopPropagation) event.stopPropagation();
    else event.cancelBubble = true;
}

Fliand 09.08.2009 17:24

Передал, но не помогло. В чем дело?

Fliand 10.08.2009 17:11

Ну подскажите


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