[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: onmouseout/over
ApuktaChehov
Друзья.

Туплю по страшному.

Есть див. По событию onmouseout/over запускается функция, которая что то делает. Тут все отлично.

Проблема в том, что если в этот див поместить любой тег(к примеру спан с текстом) то при наведении на этот текст опять же срабатывают onmouseout/over.
Почему так происходит мне понятно. Но как от этого избавиться - нет.

У меня фактически есть окошки с ссылками и текстом. При наведении на эти окошки они должны стать непрозрачными(были немного прозрачными).
JQuery не юзаю, написал свои функции.

С нетерпением жду ваших мыслей.
Спасибо!



Спустя 3 минуты, 50 секунд (31.08.2010 - 10:20) linker написал(а):
Код, код и еще раз код, мы не телепаты.

Спустя 6 минут, 6 секунд (31.08.2010 - 10:27) ApuktaChehov написал(а):
Дык, тут больше теоретически...
Вот...

function opacityUp(id, index)
{
obj = document.getElementById(id);

if(index !== 99)
{
obj.style.opacity = '0.'+index;
obj.style.filter= 'alpha(Opacity='+ index +')';
index++;
setTimeout('opacityUp(\''+ id +'\', '+ index +')', 20);
}
}


function opacityDown(id, index)
{
obj = document.getElementById(id);

if(index > 70 )
{
obj.style.opacity = '0.'+index;
obj.style.filter= 'alpha(Opacity='+ index +')';
index--;
setTimeout('opacityDown(\''+ id +'\', '+ index +')', 20);
}
}


<div class="header_div">
<div
class="header_logo_div"> 
<div class="block_div_1" id="block_div_1">
<span
class="block_title">Вырубка</span>
</div>
<div
class="block_div_2" id="block_div_2">
<span
class="block_title">Фальцовка</span>
</div>
<div
class="block_div_3" id="block_div_3">
<span
class="block_title">Ламинация</span>
</div>
<div
class="block_div_4" id="block_div_4">
<span
class="block_title">Листоподбор</span>
</div>
<div
class="block_div_5" id="block_div_5">
<span
class="block_title_smal">Клеевое<br/>скрепление</span>
</div>
</div>
</div>

Спустя 5 минут, 3 секунды (31.08.2010 - 10:32) linker написал(а):
Происходит потому, что ты наводишь мышь на этот элемент, срабатывает событие onmouseover, которое опускается ниже и доходит до главного дива, в котором есть обработчик этого события, которое собственно и выполняется. Решение: в функции-обработчики поставить проверку, на повторное выполнение.

Спустя 6 минут, 5 секунд (31.08.2010 - 10:38) ApuktaChehov написал(а):
Опа. Простите, я неполный код привел html. Я другое делал, по этому убрал часть. Вот сейчас:

<div class="header_div">
<div
class="header_logo_div"> 
<div class="block_div_1" id="block_div_1" onmouseover="opacityUp(this.id, 71);" onmouseout="opacityDown(this.id, 99);">
<span
class="block_title">Вырубка</span>
</div>
<div
class="block_div_2" id="block_div_2" onmouseover="opacityUp(this.id, 71);" onmouseout="opacityDown(this.id, 99);">
<span
class="block_title">Фальцовка</span>
</div>
<div
class="block_div_3" id="block_div_3" onmouseover="opacityUp(this.id, 71);" onmouseout="opacityDown(this.id, 99);">
<span
class="block_title">Ламинация</span>
</div>
<div
class="block_div_4" id="block_div_4" onmouseover="opacityUp(this.id, 71);" onmouseout="opacityDown(this.id, 99);">
<span
class="block_title">Листоподбор</span>
</div>
<div
class="block_div_5" id="block_div_5" onmouseover="opacityUp(this.id, 71);" onmouseout="opacityDown(this.id, 99);">
<span
class="block_title_smal">Клеевое<br/>скрепление</span>
</div>
</div>
</div>


Не, мне кажется, что дело не в повторном выполнении.
Когда я навожу курсор на див, он становить непрозрачным. А когда убираю курсор, он вновь становится прозрачным. Так же происходит и текстом. По ходу когда я навожу курсор на спан с текстом, я убираю курсор с дива. Хотя все еще нахожусь в его приделах.

Спустя 6 минут, 1 секунда (31.08.2010 - 10:44) Michael написал(а):
Надо в обработчиках проверять чтобы генератор события не был потомком твоего дива. Типа так(id="dd" - твой div):

document.getElementById('dd').onclick = function(e) {
var who = e.target || e.srcElement;
if (who.id == 'dd') {
// действия
}
}

Спустя 9 минут, 17 секунд (31.08.2010 - 10:53) inpost написал(а):
ApuktaChehov
Так надо, чтоб при наведение на сам текст скрипт не срабатывал, или наоборот сработал?
В данной ситуации стили можно из спана перебросить в див, или спан заменить дивом.

Спустя 2 минуты, 32 секунды (31.08.2010 - 10:55) ApuktaChehov написал(а):
inpost - нужно что бы не срабатывал. Пробывал я и перебрасывать и зменять. Не помогает. sad.gif Сейчас думаю над предложением Michael

Спустя 3 минуты, 20 секунд (31.08.2010 - 10:59) inpost написал(а):
ApuktaChehov
Я такое реализовывал, накладывал верхний див с текстом поверх предыдущего дива, через position. Тогда верхний слой не будет относиться к общему диву и скрипт не будет работать

Спустя 9 минут, 3 секунды (31.08.2010 - 11:08) Michael написал(а):
inpost, а в обычной ситуации див может иметь например 100 различных элементов(детей). Все их подсчитывать и позиционировать абсолютно?

p.s. В jQuery под это дело есть специально mouseenter/mouseleave в противоположность mouseover/mouseout.

Спустя 4 минуты, 4 секунды (31.08.2010 - 11:12) inpost написал(а):
Michael
Проблемы решаются по мере их появления! У меня было мало "детей", поэтому сделал так. Не спорю, что есть куда рациональнее решение и лучше!!!

Спустя 13 минут, 27 секунд (31.08.2010 - 11:25) ApuktaChehov написал(а):
Michael я плохо понял. Можешь объяснить подробнее?
Спасибо!

Спустя 5 минут, 18 секунд (31.08.2010 - 11:31) Michael написал(а):
ApuktaChehov, походу не все так выйдет легко и фиолетово с событиями мышки.
тут читай раздел: Когда триггеров больше одного: relatedTarget
получишь пару - генератор и откуда/куда. Смысл чтобы в этой паре не было ребенка. тут посмотри как по эл-ту стартануть цикл вверх, чтобы проверить, что он не дитя.

Спустя 45 минут, 59 секунд (31.08.2010 - 12:17) Michael написал(а):
Вот накидал:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd"
>
<html>
<head>
<title>
Untitled Document</title>
<meta
http-equiv="Content-Type" content="text/html; charset=utf-8">
<head>

<style
type="text/css">
#dd {padding:20px; height:300px; width:300px; background-color:yellow}
span
{background-color:red}
</style>

</head>

<body
id="bb" >
<div
id="dd">дивдив<span id="ss">сссссссс сссппппппппп пппааааааааааааааа нннннннннннн</span>дивдив</div>

<script
language="javascript">
var
obj = document.getElementById('dd');
obj.onmouseover = function(e) {
e = e || window.event;
var who = e.target || e.srcElement;
var relatedTarget = e.relatedTarget || e.fromElement;
if ((!ischild(who, obj)) && (!ischild(relatedTarget, obj))) {
alert('over yes');
}
}

obj.onmouseout = function(e) {
e = e || window.event;
var who = e.target || e.srcElement;
var relatedTarget = e.relatedTarget || e.toElement;
if ((!ischild(who, obj)) && (!ischild(relatedTarget, obj))) {
alert('out yes');
}
}

function ischild(domc, domp) {
// является ли domc потомком domp? :
if ((!domc) || (!domp)) return false;
if (domc == domp) return false;
var tek = domc;
do {
if (!tek) return false;
if (tek == document.body) return false;
if (tek == domp) return true;
tek = tek.parentNode;
}
while(true);
}
</script>
</body>
</html>



оптимизировать(повторяющийся код) уже сам.

Спустя 1 час, 26 минут, 21 секунда (31.08.2010 - 13:43) ApuktaChehov написал(а):
Уф... Спасибо всем большое я сделал, но начальнику это не понравилось.
Говорит, что этот эффект не подходит для этих меню. Так что...
Пришлось все снести sad.gif

Спустя 3 часа, 5 минут, 13 секунд (31.08.2010 - 16:48) Basili4 написал(а):
ApuktaChehov
Что вы мучаесть есть же возможность остановить вспылите события
Цитата
Всплывание события возможно отменить используя stopPropagation() (cancelBubble() в IE), однако действие по умолчанию всё равно будет выполнено. Таким образом, отмена всплывания и отмена действия по умолчанию являются отдельными и независимыми операциями.

Спустя 4 минуты, 29 секунд (31.08.2010 - 16:53) Michael написал(а):
Basili4, код в студию (html из моего примера уже готов).

Спустя 2 минуты, 45 секунд (31.08.2010 - 16:55) Basili4 написал(а):
ок щас

Спустя 16 минут, 9 секунд (31.08.2010 - 17:12) Basili4 написал(а):
вот
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd"
>
<html>
<head>
<title>
Untitled Document</title>
<meta
http-equiv="Content-Type" content="text/html; charset=utf-8">
<head>

<style
type="text/css">
#dd {padding:20px; height:300px; width:300px; background-color:yellow}
span
{background-color:red}
</style>

</head>

<body >
<div
id="dd" onmouseover="window.status ='Верхний див'">дивдив<div id="ss"
onmouseover="
window.status='Нижний див';
if (event.stopPropagation) {
// this code is for Mozilla and Opera
event.stopPropagation();
}
else if (window.event) {
// this code is for IE
window.event.cancelBubble = true;
}"
>сссссссс сссппппппппп пппааааааааааааааа нннннннннннн</div>дивдив<div>

<script
language="javascript">
</script>
</body>
</html>


Спустя 11 минут, 16 секунд (31.08.2010 - 17:23) Michael написал(а):
Цитата (Basili4 )
вот

ну так срабатывает то внутри, а не должно. Вместо window.status лучше alert для наглядности.

Спустя 3 минуты, 16 секунд (31.08.2010 - 17:26) Basili4 написал(а):
Michael
Я чет тогда не понял ну убрать событие на внутренем диве или я непому что надо то ...

Спустя 5 минут, 28 секунд (31.08.2010 - 17:32) Michael написал(а):
ТС же описал: навешивает события over/out на родителя, а они срабатывают "нелогично" также и на его детях(хотя они казалось бы внутри). И это надо убрать.

Спустя 3 часа, 1 минута, 58 секунд (31.08.2010 - 20:34) ApuktaChehov написал(а):
Я сделал как ты Michael показал. По событию узнал откуда пришел курсор и куда ушел и соответственно на это реагировал.

Еще была тупая мысль использовать onmousemove. Постоянно получать координаты мыши и когда эти координаты будут в определенном интервале запускать функцию. Но меня очень сильно напрягал тот факт, что что-то будет постоянно работать без толку, и я отказался.
Блин, как жаль, что в итоге все отменилось. Я несколько часов ковырял.

Но за то теперь знаю как это сделать. Спасибо Michael - у smile.gif

Спустя 5 дней, 19 часов, 7 минут, 37 секунд (7.09.2010 - 15:41) ApuktaChehov написал(а):
Так. Я решил это дело применить в другом месте, где вроде, это неплохо смотрится.ссылка

Меню слева.

Все неплохо работает во всех браузерах кроме IE6. В нем скрипт работает тоже, но верстку перекосило. Но это не беда, верстать под IE6 - задачи не было.

И так. Какой косяк: если навести на ссылку Услуги и сразу же переместить на ссылку оборудование или наоборот, обе менюшки оказываются открытыми. Но это только в первый раз как загрузилась страница. После все работает корректно.

Вот код скрипта: код очень простой
function menu_close(obj, id)
{
obj.onmouseout = function(event)
{
var event = event || window.event;
var who = event.target || event.srcElement;
var relTarg = event.relatedTarget || event.toElement

if(relTarg.id !== id)
document.getElementById(id).style.display = 'none';
}
}


Я определил, что первый раз не срабатывает obj.onmouseout = function(event).
А вот почему не срабатывает я не знаю sad.gif

Может есть, у кого-нибудь мысли?

Спустя 14 минут, 13 секунд (7.09.2010 - 15:55) inpost написал(а):
ApuktaChehov
А как насчет "При наведении на другой объект" -> скрыть остальные, этот вывести. Собственно тяжелее, но функциональнее.

Спустя 38 секунд (7.09.2010 - 15:56) ApuktaChehov написал(а):
inpost - я так всегда и делал. Но сейчас хочу выяснить почему так.

Спустя 17 часов, 53 минуты, 14 секунд (8.09.2010 - 09:49) ApuktaChehov написал(а):
Мыслей нет? Печально sad.gif

Спустя 49 минут, 50 секунд (8.09.2010 - 10:39) ZSH написал(а):
z-index

Спустя 1 час, 33 минуты, 58 секунд (8.09.2010 - 12:13) ApuktaChehov написал(а):
z-index? А он тут причем? Мне непонятно, почему функция не срабатывает нормально.


_____________
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.