Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Всплывающее меню (проблемы) (https://javascript.ru/forum/dom-window/18503-vsplyvayushhee-menyu-problemy.html)

Барин 03.07.2011 22:59

Всплывающее меню (проблемы)
 
Вложений: 1
Приветствую всех!
Сделал контекстное меню, но есть неполадки в работе. Так как разбираюсь в Яваскрипте я слабо, то, возможно, мой способ покажется страшным. Однако, если есть советы, я с удовольствием приму их к сведению.
Проблема: Меню возникает по клику и исчезает по уведению мыши, однако, после выбора пункта меню, хочу, чтобы оно закрывалось, но не могу сделать этого. Промучавшись некоторе время замудрил существующий вариант ещё больше. Скрипт стал ПОЧТИ идеален: меню открывается по клику, закрывается по уведению или после выбора, однако, если оно закрылось по выбору пункта, то потом оно откроется нормально, а если оно закрылось по уведению, то потом открывается только со второго раза.
Код (оба варианта меню):
<!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>Меню</title>
<script>
function mark(id)
{
	 document.getElementById(id).className = 'hover';
}
/*Сделать не выделенным*/
function not_mark(id)
{
	 document.getElementById(id).className = 'not_hover';
}
/*Показывать если не виден, скрывать если виден*/
function show_hide(id)
{
	 if (document.getElementById(id).className=="")
	 {
		 document.getElementById(id).className="invisible";
	 }
	 else
	 {
		 document.getElementById(id).className="";
	 }
}
/*показать элемент, назначив ему определённный класс*/
function show2(id,classN)
{
	 document.getElementById(id).className=classN;	
 }
/*Сарятать элемент*/
function hide(id)
{
	 document.getElementById(id).className='invisible';
}
function hide2(id)
{
	 if (document.getElementById(id).style.display == 'none')
	 {
		 document.getElementById(id).style.display = '';	
	 }
	 else
	 {
		 document.getElementById(id).style.display = 'none';	
	 }
}
/*Из одного элемента вставить текст в другой*/
function move(id,id2)
{
	 document.getElementById(id).innerHTML = document.getElementById(id2).innerHTML;
}
</script>
<style>
/*Для всех контекстных меню*/
div.context_menu{
position:absolute;
padding-top:4px; padding-bottom:4px; padding-left:3px; padding-right:5px;
border: 1px solid #999999;
border-right: 2px solid #999999;
border-bottom: 2px solid #999999;
background-color:#fcfcfc;
}
/*Стиль пунктов меню*/
div.context_menu div.not_hover{
font-size:12px; color:333333;
text-indent:8px;
height:12px;
cursor:default;
margin-left:2px;
}
div.context_menu div.hover{
font-size:12px; color:333333;
text-indent:8px;
height:12px;
cursor:default;
text-decoration:underline;
padding-left:2px;
}
/*Убрать подчёркивание стрелки*/
img.context_menu_bullet{
float:left;
padding-top:4px;
padding-left:1px;
}
.invisible{
display:none;
}
</style>
</head>
<body>	

 <div style='float:left;margin-top:54px; margin-left:20px; width:130px; text-align:left; margin-right:15px;color:#000000;'>
	 <div id='vibor2_menu_place' onClick=show2('vibor2_menu','context_menu') onMouseOut=hide('vibor2_menu')>
		 <div id='vibor2_menu_current' style='float:left;text-decoration:underline; cursor:default;font-size:11px;'>Выбор 1</div>
		 <img class='context_menu_bullet' src='bullet_mini_bottom.png'>
						
		 <div id='vibor2_menu' onMouseOver=show2('vibor2_menu','context_menu') class='invisible' style='margin-top:10px; margin-left:-14px; width:130px;text-align:left;color:#333333;'>
			 <div id='vibor2_menu_punkt_1' class='not_hover' onMouseOver='mark(this.id)'  onMouseOut='not_mark(this.id)' onClick=move('vibor2_menu_current','vibor2_menu_punkt_1')>Выбор 1</div>
			 <div id='vibor2_menu_punkt_2' class='not_hover' onMouseOver='mark(this.id)'  onMouseOut='not_mark(this.id)' onClick=move('vibor2_menu_current','vibor2_menu_punkt_2')>Выбор 2</div>	
			 <div id='vibor2_menu_punkt_3' class='not_hover' onMouseOver='mark(this.id)'  onMouseOut='not_mark(this.id)' onClick=move('vibor2_menu_current','vibor2_menu_punkt_3')>Выбор 3</div>
		 </div>
	 </div>

<div style='float:left;margin-top:54px; margin-left:20px; width:130px; text-align:left; margin-right:15px;color:#000000;'>
	 <div id='vibor_menu_place' onClick=show2('vibor_menu','context_menu'),hide2('vibor_menu') onMouseOut=hide('vibor_menu')>
		 <div id='vibor_menu_current' style='float:left;text-decoration:underline; cursor:default;font-size:11px;'>Выбор 1</div>
		 <img class='context_menu_bullet' src='bullet_mini_bottom.png'>
						
		 <div id='vibor_menu' onMouseOver=show2('vibor_menu','context_menu') class='invisible' style='margin-top:10px; margin-left:-14px; width:130px;text-align:left;color:#333333;display:none;'>
			 <div id='vibor_menu_punkt_1' class='not_hover' onMouseOver='mark(this.id)'  onMouseOut='not_mark(this.id)' onClick=move('vibor_menu_current','vibor_menu_punkt_1')>Выбор 1</div>
			 <div id='vibor_menu_punkt_2' class='not_hover' onMouseOver='mark(this.id)'  onMouseOut='not_mark(this.id)' onClick=move('vibor_menu_current','vibor_menu_punkt_2')>Выбор 2</div>	
			 <div id='vibor_menu_punkt_3' class='not_hover' onMouseOver='mark(this.id)'  onMouseOut='not_mark(this.id)' onClick=move('vibor_menu_current','vibor_menu_punkt_3')>Выбор 3</div>
		 </div>
	 </div>

</body>
</html>

Для удобства, выкладываю файлом.
Помогите разобраться.

ksa 04.07.2011 09:18

Цитата:

Сообщение от Барин
Помогите разобраться.

Для начала проверь количество открытых и закрытых ДИВов... Напомню что есть прекрасные конструкции

<ul>
   <li>Item</li>
</ul>


Они ооочень хорошо используются для создания меню. Да и разметка с ними смотрится гораздо приятнее... :)

Барин 04.07.2011 18:28

С дивами всё хорошо.

ksa 05.07.2011 08:27

Цитата:

Сообщение от Барин
С дивами всё хорошо.

В твоём примере не закрыто как минимум два ДИВа...

ksa 05.07.2011 10:03

Барин, даже после добавления недостающих деталей потестить твой пример не предоставляется возможным...
Вот можешь попробовать сам. :)

<!DOCTYPE html>
<html>
<head>
<title>test</title>
<style type="text/css">
/*Для всех контекстных меню*/
div.context_menu {
	position:absolute;
	padding-top:4px; padding-bottom:4px; padding-left:3px; padding-right:5px;
	border: 1px solid #999999;
	border-right: 2px solid #999999;
	border-bottom: 2px solid #999999;
	background-color:#fcfcfc;
}
/*Стиль пунктов меню*/
div.context_menu div.not_hover {
	font-size:12px; color:333333;
	text-indent:8px;
	height:12px;
	cursor:default;
	margin-left:2px;
}
div.context_menu div.hover {
	font-size:12px; color:333333;
	text-indent:8px;
	height:12px;
	cursor:default;
	text-decoration:underline;
	padding-left:2px;
}
/*Убрать подчёркивание стрелки*/
img.context_menu_bullet {
	float:left;
	padding-top:4px;
	padding-left:1px;
}
.invisible {
	display:none;
}
</style>
<script type="text/javascript">
function mark(id) {
	document.getElementById(id).className = 'hover';
}
/*Сделать не выделенным*/
function not_mark(id) {
	document.getElementById(id).className = 'not_hover';
}
/*Показывать если не виден, скрывать если виден*/
function show_hide(id) {
	if (document.getElementById(id).className=="") {
		document.getElementById(id).className="invisible";
	} else {
		document.getElementById(id).className="";
	}
}
/*показать элемент, назначив ему определённный класс*/
function show2(id,classN) {
	document.getElementById(id).className=classN;	
 }
/*Сарятать элемент*/
function hide(id) {
	document.getElementById(id).className='invisible';
}
function hide2(id) {
	if (document.getElementById(id).style.display == 'none') {
		document.getElementById(id).style.display = '';	
	} else {
		document.getElementById(id).style.display = 'none';	
	}
}
/*Из одного элемента вставить текст в другой*/
function move(id,id2) {
	document.getElementById(id).innerHTML = document.getElementById(id2).innerHTML;
}
</script>
</head>
<body>
<div style='float:left;margin-top:54px; margin-left:20px; width:130px; text-align:left; margin-right:15px;color:#000000;'>
	<div id='vibor2_menu_place' onClick=show2('vibor2_menu','context_menu') onMouseOut=hide('vibor2_menu')>
		<div id='vibor2_menu_current' style='float:left;text-decoration:underline; cursor:default;font-size:11px;'>Выбор 1</div>
		<img class='context_menu_bullet' src='bullet_mini_bottom.png'>
		<div id='vibor2_menu' onMouseOver=show2('vibor2_menu','context_menu') class='invisible' style='margin-top:10px; margin-left:-14px; width:130px;text-align:left;color:#333333;'>
			<div id='vibor2_menu_punkt_1' class='not_hover' onMouseOver='mark(this.id)'  onMouseOut='not_mark(this.id)' onClick=move('vibor2_menu_current','vibor2_menu_punkt_1')>Выбор 1</div>
			<div id='vibor2_menu_punkt_2' class='not_hover' onMouseOver='mark(this.id)'  onMouseOut='not_mark(this.id)' onClick=move('vibor2_menu_current','vibor2_menu_punkt_2')>Выбор 2</div>	
			<div id='vibor2_menu_punkt_3' class='not_hover' onMouseOver='mark(this.id)'  onMouseOut='not_mark(this.id)' onClick=move('vibor2_menu_current','vibor2_menu_punkt_3')>Выбор 3</div>
		</div>
	</div>
</div>
<div style='float:left;margin-top:54px; margin-left:20px; width:130px; text-align:left; margin-right:15px;color:#000000;'>
	<div id='vibor_menu_place' onClick=show2('vibor_menu','context_menu'),hide2('vibor_menu') onMouseOut=hide('vibor_menu')>
		<div id='vibor_menu_current' style='float:left;text-decoration:underline; cursor:default;font-size:11px;'>Выбор 1</div>
		<img class='context_menu_bullet' src='bullet_mini_bottom.png'>
		<div id='vibor_menu' onMouseOver=show2('vibor_menu','context_menu') class='invisible' style='margin-top:10px; margin-left:-14px; width:130px;text-align:left;color:#333333;display:none;'>
			<div id='vibor_menu_punkt_1' class='not_hover' onMouseOver='mark(this.id)'  onMouseOut='not_mark(this.id)' onClick=move('vibor_menu_current','vibor_menu_punkt_1')>Выбор 1</div>
			<div id='vibor_menu_punkt_2' class='not_hover' onMouseOver='mark(this.id)'  onMouseOut='not_mark(this.id)' onClick=move('vibor_menu_current','vibor_menu_punkt_2')>Выбор 2</div>	
			<div id='vibor_menu_punkt_3' class='not_hover' onMouseOver='mark(this.id)'  onMouseOut='not_mark(this.id)' onClick=move('vibor_menu_current','vibor_menu_punkt_3')>Выбор 3</div>
		</div>
	</div>
</div>
</body>
</html>

ksa 05.07.2011 10:06

Хотя в Опере потестить можно. :D Изначально смотрел в ИЕ7, так там даже на выпадающее меню не попасть.

ksa 05.07.2011 10:12

Барин, если вместо
this.id

использовать просто
this

то и функции заметно "облегчатся"...
function mark(Obj) {
	Obj.className = 'hover';
}
/*Сделать не выделенным*/
function not_mark(Obj) {
	Obj.className = 'not_hover';
}

ksa 05.07.2011 10:54

Барин, пример у тебя конечно из серии "как делать не нужно"... Но вот вроде то, что ты хотел.

<!DOCTYPE html>
<html>
<head>
<title>test</title>
<style type="text/css">
/*Для всех контекстных меню*/
div.context_menu {
	position:absolute;
	padding-top:4px; padding-bottom:4px; padding-left:3px; padding-right:5px;
	border: 1px solid #999999;
	border-right: 2px solid #999999;
	border-bottom: 2px solid #999999;
	background-color:#fcfcfc;
}
/*Стиль пунктов меню*/
div.context_menu div.not_hover {
	font-size:12px; color:333333;
	text-indent:8px;
	height:12px;
	cursor:default;
	margin-left:2px;
}
div.context_menu div.hover {
	font-size:12px; color:333333;
	text-indent:8px;
	height:12px;
	cursor:default;
	text-decoration:underline;
	padding-left:2px;
}
/*Убрать подчёркивание стрелки*/
img.context_menu_bullet {
	float:left;
	padding-top:4px;
	padding-left:1px;
}
.invisible {
	display: none;
}
.item {
	float:left;
	text-decoration:underline; 
	cursor:default;
	font-size:11px;
}
</style>
<script type="text/javascript">
function mark(Obj) {
	Obj.className = 'hover';
}
/*Сделать не выделенным*/
function not_mark(Obj) {
	Obj.className = 'not_hover';
}
/*Показывать если не виден, скрывать если виден*/
function show_hide(Obj) {
	Obj.className=(document.getElementById(id).className=="")? 'invisible': ''
}
/*показать элемент, назначив ему определённный класс*/
function show2(id,classN) {
	document.getElementById(id).className=classN;	
 }
/*Сарятать элемент*/
function hide(id) {
	document.getElementById(id).className='invisible';
}
/*Из одного элемента вставить текст в другой*/
function move(id,Obj) {
	document.getElementById(id).innerHTML = Obj.innerHTML;
	Obj.parentNode.className='invisible'
}
</script>
</head>
<body>
<div style='float:left;margin-top:54px; margin-left:20px; width:130px; text-align:left; margin-right:15px;color:#000000;'>
	<div id='vibor2_menu_place' onmouseout="hide('vibor2_menu')">
		<div id='vibor2_menu_current' onclick="show2('vibor2_menu','context_menu')" class='item' style=''>Выбор 1</div>
		<img class='context_menu_bullet' src='bullet_mini_bottom.png'>
		<div id='vibor2_menu' onmouseover=show2('vibor2_menu','context_menu') class='invisible' style='margin-top:10px; margin-left:-14px; width:130px;text-align:left;color:#333333;'>
			<div id='vibor2_menu_punkt_1' class='not_hover' onmouseover='mark(this)'  onmouseout='not_mark(this)' onclick="move('vibor2_menu_current',this)">Выбор 1</div>
			<div id='vibor2_menu_punkt_2' class='not_hover' onmouseover='mark(this)'  onmouseout='not_mark(this)' onclick="move('vibor2_menu_current',this)">Выбор 2</div>	
			<div id='vibor2_menu_punkt_3' class='not_hover' onmouseover='mark(this)'  onmouseout='not_mark(this)' onclick="move('vibor2_menu_current',this)">Выбор 3</div>
		</div>
	</div>
</div>
<div style='float:left;margin-top:54px; margin-left:20px; width:130px; text-align:left; margin-right:15px;color:#000000;'>
	<div id='vibor_menu_place' onmouseout="hide('vibor_menu')">
		<div id='vibor_menu_current' onclick="show2('vibor_menu','context_menu')" class='item' style=''>Выбор 1</div>
		<img class='context_menu_bullet' src='bullet_mini_bottom.png'>
		<div id='vibor_menu' onmouseover=show2('vibor_menu','context_menu') class='invisible' style='margin-top:10px; margin-left:-14px; width:130px;text-align:left;color:#333333;'>
			<div id='vibor_menu_punkt_1' class='not_hover' onmouseover='mark(this)'  onmouseout='not_mark(this)' onclick="move('vibor_menu_current',this)">Выбор 1</div>
			<div id='vibor_menu_punkt_2' class='not_hover' onmouseover='mark(this)'  onmouseout='not_mark(this)' onclick="move('vibor_menu_current',this)">Выбор 2</div>	
			<div id='vibor_menu_punkt_3' class='not_hover' onmouseover='mark(this)'  onmouseout='not_mark(this)' onclick="move('vibor_menu_current',this)">Выбор 3</div>
		</div>
	</div>
</div>
</body>
</html>


В ИЕ7 не потестить конечно... :D

Барин 07.07.2011 09:22

Спасибо, всё отлично работает!
А на IE 7 я и не расчитывал, на мой сайт вообще опасно заходить с этого браузера. Буду делать определение, если ИЕ ниже 8 версии, то буду перекидывать пользователя на страницу с загрузкой браузеров :)


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