Туплю по страшному.
Есть див. По событию 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 - нужно что бы не срабатывал. Пробывал я и перебрасывать и зменять. Не помогает.
Сейчас думаю над предложением Michael

Спустя 3 минуты, 20 секунд (31.08.2010 - 10:59) inpost написал(а):
ApuktaChehov
Я такое реализовывал, накладывал верхний див с текстом поверх предыдущего дива, через position. Тогда верхний слой не будет относиться к общему диву и скрипт не будет работать
Я такое реализовывал, накладывал верхний див с текстом поверх предыдущего дива, через position. Тогда верхний слой не будет относиться к общему диву и скрипт не будет работать
Спустя 9 минут, 3 секунды (31.08.2010 - 11:08) Michael написал(а):
inpost, а в обычной ситуации див может иметь например 100 различных элементов(детей). Все их подсчитывать и позиционировать абсолютно?
p.s. В jQuery под это дело есть специально mouseenter/mouseleave в противоположность mouseover/mouseout.
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
получишь пару - генератор и откуда/куда. Смысл чтобы в этой паре не было ребенка. тут посмотри как по эл-ту стартануть цикл вверх, чтобы проверить, что он не дитя.
тут читай раздел: Когда триггеров больше одного: 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 написал(а):
Уф... Спасибо всем большое я сделал, но начальнику это не понравилось.
Говорит, что этот эффект не подходит для этих меню. Так что...
Пришлось все снести
Говорит, что этот эффект не подходит для этих меню. Так что...
Пришлось все снести

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

Спустя 5 дней, 19 часов, 7 минут, 37 секунд (7.09.2010 - 15:41) ApuktaChehov написал(а):
Так. Я решил это дело применить в другом месте, где вроде, это неплохо смотрится.ссылка
Меню слева.
Все неплохо работает во всех браузерах кроме IE6. В нем скрипт работает тоже, но верстку перекосило. Но это не беда, верстать под IE6 - задачи не было.
И так. Какой косяк: если навести на ссылку Услуги и сразу же переместить на ссылку оборудование или наоборот, обе менюшки оказываются открытыми. Но это только в первый раз как загрузилась страница. После все работает корректно.
Вот код скрипта: код очень простой
Я определил, что первый раз не срабатывает obj.onmouseout = function(event).
А вот почему не срабатывает я не знаю
Может есть, у кого-нибудь мысли?
Меню слева.
Все неплохо работает во всех браузерах кроме 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).
А вот почему не срабатывает я не знаю

Может есть, у кого-нибудь мысли?
Спустя 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 написал(а):
Мыслей нет? Печально

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