Всплывающее меню (проблемы)
Вложений: 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> Для удобства, выкладываю файлом. Помогите разобраться. |
Цитата:
<ul> <li>Item</li> </ul> Они ооочень хорошо используются для создания меню. Да и разметка с ними смотрится гораздо приятнее... :) |
С дивами всё хорошо.
|
Цитата:
|
Барин, даже после добавления недостающих деталей потестить твой пример не предоставляется возможным...
Вот можешь попробовать сам. :) <!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> |
Хотя в Опере потестить можно. :D Изначально смотрел в ИЕ7, так там даже на выпадающее меню не попасть.
|
Барин, если вместо
this.id использовать просто this то и функции заметно "облегчатся"... function mark(Obj) { Obj.className = 'hover'; } /*Сделать не выделенным*/ function not_mark(Obj) { Obj.className = 'not_hover'; } |
Барин, пример у тебя конечно из серии "как делать не нужно"... Но вот вроде то, что ты хотел.
<!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 |
Спасибо, всё отлично работает!
А на IE 7 я и не расчитывал, на мой сайт вообще опасно заходить с этого браузера. Буду делать определение, если ИЕ ниже 8 версии, то буду перекидывать пользователя на страницу с загрузкой браузеров :) |
Часовой пояс GMT +3, время: 03:55. |