Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Находится ли мышка над дивом ? (выпадающее меню) (https://javascript.ru/forum/jquery/11036-nakhoditsya-li-myshka-nad-divom-vypadayushhee-menyu.html)

advsm 03.08.2010 14:55

Находится ли мышка над дивом ? (выпадающее меню)
 
Мне нужно сделать выпадающее меню. Поведение такое: навел на пункт меню - открылось выпадющее из него. Увел курсор - выпадающее меню закрылось. Событие mouseover() помогает открывать меню. Но вот с закрытием меню проблема. Не знаю когда его делать.

Его нужно закрывать в двух случаях. Если с пункта меню уведен курсор и он находится не над открывшимся выпадающем меню. А также если с выпадающего меню уведен курсор, но опять же, если он не переведен на меню.

Тоесть нужно проверить - находится ли курсор мышки над каким-то дивом. А как эту проверку сделать я не знаю. Кто-нибудь может помочь с этим ?

Если сумбурно изьясняюсь - ссылка на сайт: http://keramiki.ru/
Спасибо всем за помощь.

Gvozd 03.08.2010 15:01

Вы просите готовый скрипт с нуля.

Это работа, и за нее обычно платят деньги.
Для таких сообщений предназначен раздел форума "Работа".

Если вы все же хотите, чтобы вам помогли - приложите какие-то усилия сами и задавайте вопросы по ходу дела.

advsm 03.08.2010 15:03

Я не прошу говорый сприт с нуля. о_О
Я прошу чтобы мне подсказали как определить, находится ли мышка над определенным блоком в данный момент.

advsm 03.08.2010 15:06

Сайт, ссылку на который я дал в первом посте - это как раз то, что я делаю. Но там менюшка сейчас прыгает и закрывается даже тогда, когда не должна. И я пытаюсь это исправить.

Gvozd 03.08.2010 15:11

помимо события mouseover есть еще и событие mouseout

обычно делают так:
при mouseover, если меню еще не показано, то показать его, и сбросить таймер(о нем речь дальше)
при mouseout сделать
var timer = setTimeout(function(){/* здесь скрываем меню */}, 500);

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

advsm 03.08.2010 15:14

Точно. Читал про сбросы таймера, но не додумался, что так можно сделать в моем случае. Спасибо за помощь!

rgwergwegwerg 16.09.2014 08:35

что ж такое .полгода пасся на этом форуме....

больно осознавать, что большая половина участников не знает что такое рекурсия мало того не может назвать древовидное меню древовидным меню
http://javascript.ru/forum/jquery/11...selektory.html

кидай почту пришлю сайт в архиве.

tsigel 16.09.2014 08:38

rgwergwegwerg,
Чел 4 года ждал твоего ответа :)

rgwergwegwerg 16.09.2014 09:36

что делать. действительно надо различать програмистов и "веб грамистов", последним наверно практически невозможно объяснить как работает тод же квик-сорт.

tsigel 16.09.2014 09:55

rgwergwegwerg,
Ты странный тип :)
Ты пришел на сайт на котором помогают людям что-то сделать, на котором люди учатся и задают вопросы по ходу обучения и удивляешься что они ничего не знают. Я думаю что если ты спросишь что такое рекурсия у любого с кармой >= 100, то тебе скажут без проблем :)

rgwergwegwerg 16.09.2014 10:36

да? вперед.
что расскажешь про всплытие событий?

и почему все с упорством ослика рисуют вложенные спауны или ли руками?

rgwergwegwerg 16.09.2014 10:38

да и еще забыл че никто ничего за 4 года не ответил?

признаюсь JS заинтересовал полгода назад.

tsigel 16.09.2014 10:40

Цитата:

чтог раскажешь про всплытие событий?
Представь себе, я знаю что такое "Делегирование событий" и как оно работает :)

Охота пофлудить на тему образованности местных программеров - создай тему в оффтопике.

tsigel 16.09.2014 10:41

rgwergwegwerg,
Тебя трудно понимать без знаков препинания, прошу читай свои посты перед отправкой. Что например это значит?
Цитата:

спауны или ли руками?
"или" или "ли"?

rgwergwegwerg 16.09.2014 10:44

SPAN и LI


и если ты думаешь что просто потанутся решил - силно ошибешся.

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

tsigel 16.09.2014 10:46

rgwergwegwerg,
Я не знаю почему твои "все" это делают. Я "руками" верстку не трогаю, для этого шаблонизаторы придумали :)

rgwergwegwerg 16.09.2014 10:53

да-да конЭчно....

делаем руками а не головой. это и обидно.

привыкли вбивать "шаблонизатором" списки охренительной вложенности, а написать самому 20 стросчек и всю жизнь пользоваться.

касательно темы
чета мне самому захотелось написать - сделал набросок. тут нужно положение мыши не над дивом, а над многими дивами.
сделал так: только мыша уходит с дива запускаем отработчик события который берет this.id и в сотвествующем массиве меняет мышка над дивом с 1 на 0 и наоборот если над дивом мыша. после запускаем отложенный по времени подпрограмм, который эндит друг за другом элементы массива получилось 1 ничего не делаем получился ноль все дивы грохаем. вернее "орит".

P.S.
тут меня кста посетила прекрасная идея. навига я массив таскаю? ушла мышь с последний панели - всем кирдык.

tsigel 17.09.2014 11:10

rgwergwegwerg,
молодчик, может скоро даже познаешь классы и нследование в js)

rgwergwegwerg 17.09.2014 17:05

Цитата:

Сообщение от tsigel (Сообщение 330982)
rgwergwegwerg,
молодчик, может скоро даже познаешь классы и нследование в js)

идиот.

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

дема ниже. наследование здесь ненужно.

tsigel 17.09.2014 17:09

rgwergwegwerg,
Следи за базаром.

rgwergwegwerg 17.09.2014 17:12

var PMenu= {	depth:		0 ,
		panels_m_out:	[],
		root:		null
};

PMenu.clear= function(){
    alert('gweergwergwergwergwerg');
return
}

PMenu.mouseCk= function(ev){
    var panel_depth;
    const DELAY= 500;
    
    ev.stopPropagation();
    setTimeout('PMenu.clear()', DELAY);
return   
}

PMenu.nextPanel= function(ev){
    var div;

    ev.stopPropagation();
    PMenu.depth++;
    PMenu.createDiv();
    PMenu.panels_m_out.push(0);
return
}

PMenu.init= function(){
    PMenu.root= document.getElementById('start_element');
return
}

PMenu.createDiv= function(){
    var div= document.createElement('div');
    
    div.className= 'PMlevel'+ PMenu.depth;
    div.onclick= PMenu.nextPanel;
    div.onmouseout= PMenu.mouseCk;
    div.id= PMenu.depth;
    PMenu.root.appendChild(div);
return
}

PMenu.init();
PMenu.createDiv(


а вот такие стили - никакго наследования здесь оно вредно:
.PMlevel0 { position: absolute;
height: 500px;
width: 50px;
top: 100px;
left: 0%;
z-index: 10;
background-color: red;
}

.PMlevel1 { position: absolute;
height: 400px;
width: 50px;
top: 100px;
left: 51px;
z-index: 10;
background-color: red;
}

.PMlevel2 { position: absolute;
height: 200px;
width: 50px;
top: 100px;
left: 102px;
z-index: 10;
background-color: red;
}

rgwergwegwerg 17.09.2014 17:13

Цитата:

Сообщение от tsigel (Сообщение 331025)
rgwergwegwerg,
Следи за базаром.

нормально т.е. пришел сказал БРЕД я те дему показываю, а ты еще на что-то там обижаешься я тебя за язык не тянул.

tsigel 17.09.2014 17:14

rgwergwegwerg,
просто return писать не принято, возвращают всегда что-то (хоть false или undefined), на это любая ide ругается, сдается мне ты кодишь в блокнотике :)

rgwergwegwerg 17.09.2014 17:16

Цитата:

Сообщение от tsigel (Сообщение 331029)
rgwergwegwerg,
просто return писать не принято, возвращают всегда что-то (хоть false или undefined), на это любая ide ругается, сдается мне ты кодишь в блокнотике :)

и че ? в СИ принято. а что там не принято меня не интересует. да и пишу я в kate.

ксти не писать ретурн придумали "вебрамисты" ретурн означет возврат(берем со стека указатель и идем по нему) если программа возвращает значение пишут return <значение>.

tsigel 17.09.2014 17:22

rgwergwegwerg,
Ниче-ниче. Ты очень умен, сообразителен, грамотно пишешь, офигенный программист и вообще победил. Я пожалуй не буду с тобой препираться.

rgwergwegwerg 17.09.2014 17:26

Цитата:

Сообщение от tsigel (Сообщение 331031)
rgwergwegwerg,
Ниче-ниче. Ты очень умен, сообразителен, грамотно пишешь, офигенный программист и вообще победил. Я пожалуй не буду с тобой препираться.

а стабой не припераюсь ты мне не интересен. я показываю пример с наследование и объясняю что не писать return это "узаконенная ошибка".

tsigel 17.09.2014 17:27

:lol:
В том коде нет наследования :haha:

rgwergwegwerg 17.09.2014 17:30

Цитата:

Сообщение от tsigel (Сообщение 331036)
:lol:
В том коде нет наследования :haha:

угададал. я тебе с самого начала сказал наследования здесь не нужно. еше раз для одаренных: как ты будешь позиционировать панели друг относительно друга? у них корневой элемент должен быть ОДИН. втюхиваеш абсолют и двигаешь как хочешь.

ща стили покажу.

tsigel 17.09.2014 17:34

Цитата:

Сообщение от rgwergwegwerg (Сообщение 331035)
а стабой не припераюсь ты мне не интересен. я показываю пример с наследование и объясняю что не писать return это "узаконенная ошибка".

ещё разок:

Цитата:

Сообщение от rgwergwegwerg (Сообщение 331035)
я показываю пример с наследование

и теперь:

Цитата:

Сообщение от rgwergwegwerg (Сообщение 331035)
угададал. я тебе с самого начала сказал наследования здесь не нужно.

Все, это моё последнее сообщение тебе. Я не общаюсь с людьми которые сами не понимают что говорят :)

rgwergwegwerg 17.09.2014 17:39

хвать базарить покажи как будет с наследованием

кста здесь он нужно http://javascript.ru/forum/jquery/11...elektory.html#

видишь? каждый элемент кроме самого глубокого родитель последующего. наверное там тоже "кодят" на JS с использованием шаблонизаторов, меньше 30 строчек чистого JS c ненавидимым вебграмистами ретурном.

rgwergwegwerg 21.09.2014 13:15

как успехи? тут наковырял чего-то на днях закончу.

у меня получилось с покиданием блока так:

tbl_tag.onmouseover= LMenu.mouseTop;
tbl_tag.onmouseout= LMenu.mouseOut;

LMenu.mouseTop - вывешивает признак что мыша над блогом 1 и делает setTimeout('LMenu.nextPanel()', DELAY);

LMenu.mouseOut - проверяет чтоб блок был тот же и флаг мышь над блоком ставить в ноль

LMenu.nextPanel() - проверяет это флаг и если да рисует панель (за DELAY мышь не ушла). там кошено куча примочек чтоб панели не рисовать просто так... ну короче потом - это по сути вопроса.

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

позиционирование блоков как и планировал div.style.top= LMenu.getY()+ 'px';

rgwergwegwerg 24.09.2014 17:50

написал твое меню
http://sourceforge.net/p/ribbonmenu/code/HEAD/tree/

действий нет. будет настроение сделаю. кстати его можно одними css3 сделать. ну это так к слову.


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