Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Проблема при выполнении hover (https://javascript.ru/forum/jquery/2829-problema-pri-vypolnenii-hover.html)

namez 15.02.2009 14:20

Проблема при выполнении hover
 
мой живой пример
_mmns.ру/files/moo2/

понаводите на картинки
после over и out почему второй раз повторяется цикл у элемента? (еще раз over и out)

что делаю не так?

спасибо. только сегодня начал изучать...

namez 16.02.2009 00:56

ребят тут кто-нибудь есть? =)
....

не подскажите посещаемые форумы по jquery?

namez 17.02.2009 01:47

ребят? грустно как-то не понимаю.

hogart 17.02.2009 11:25

http://docs.jquery.com/Events/hover
«
Additionally, checks are in place to see if the mouse is still within the specified element itself (for example, an image inside of a div), and if it is, it will continue to 'hover', and not move out (a common error in using a mouseout event handler).
»
Подозреваю, дело в этом. Поставьте fadeOut на mouseover, а fadeIn на mouseleave. Или делайте проверку внутри функций.

namez 18.02.2009 12:55

hogart спасибо за отклик.

не совсем понимаю правда
делаю

$(document).ready(function(){

$("a img").mouseover(function(){
		$(this).fadeOut(500);
 	});

$("a img").bind("mouseleave",function(){
		$(this).fadeIn(500);
 	});

 	 });


нифига same, но добавляю к mouseleave mouseenter ("mouseenter mouseleave") то не повторяется, но fadeIn сразу срабатывает

в общем подскажите я сижу неделю уже с этим 8(

спасибо.

namez 18.02.2009 15:10

вот получилось вот так (все здесь же _mmns.ру/files/moo2/)

$(document).ready(function(){

$("ul li").bind("mouseenter",function(){
		$("a img", this).fadeOut(500).bind("mouseleave",function(){
		$("a img").fadeIn(500);})

 	});

 	 });


то есть можно по разному цепочки делать, не только ховером, маусином и маусаутом реализовывать?
нашел в яндексе единственую тему как раз http://www.fedya.net/articles/javascript/mouseenter

я правильно сделал? вы уж простите мне это важно понять тк только начал работать с javascript

namez 18.02.2009 17:09

Рано зарадывался.. в лисе баг у меня
после fadeOut сразу срабатывает fadeIn
8(

hogart 19.02.2009 12:44

Есть какая-то тонкость в событиях onmouseover и onmouseout, насколько я помню. Погуглите по этим словам.

namez 19.02.2009 13:15

хммм... не поможете я так понял..

причем здесь onmouseover и onmouseout? вы опечатались?

mouseenter И mouseleave у меня только ведь в коде

жаль что помощи нет на данном форуме.

x-yuri 19.02.2009 16:09

namez, а можно еще раз выложить страницу?

namez 19.02.2009 16:23

Цитата:

Сообщение от x-yuri (Сообщение 12897)
namez, а можно еще раз выложить страницу?

буквы ру заменил просто
http://mmns.ru/files/moo2/

x-yuri 19.02.2009 16:33

проблема mouseover/mouseout... Допустим есть два div'а - внутренний и внешний. На внешний повешены обработчики mouseover/mouseout. При пересечении границы внутреннего div'а произойдут 2 события mouseout+mouseover. Поэтому jQuery добавила mouseleave и mouseenter. Сейчас посмотрю, что у тебя там по ссылке

x-yuri 19.02.2009 16:59

$("a img").bind("mouseenter", function() {
	$(this).fadeOut(500);
});
$("a img").bind("mouseleave", function() {
	$(this).fadeIn(500);
});

здесь проблема в том, что в результате fadeOut элемент становится скрытым. И тут начинаются приколы. Толком не разобрался, но странно получается, по-разному (в разных браузерах) и не так как требовалось. А надо так (насколько я понял):
$("a img").bind("mouseenter", function() {
	$(this).fadeOut(500).fadeIn(500);
});

а, даже не так надо, подумаю

x-yuri 19.02.2009 17:08

$("a img").bind("mouseenter", function() {
	$(this).fadeTo(500, 0.1);
});
$("a img").bind("mouseleave", function() {
	$(this).fadeTo(500, 1);
});

? ;-)
в данном случае можно даже mouseOver/mouseOut

namez 19.02.2009 17:29

Цитата:

Сообщение от x-yuri (Сообщение 12909)
$("a img").bind("mouseenter", function() {
	$(this).fadeTo(500, 0.1);
});
$("a img").bind("mouseleave", function() {
	$(this).fadeTo(500, 1);
});

? ;-)
в данном случае можно даже mouseOver/mouseOut

=) Вот она золотая серединка... :o
x-yuri cпасибо!

Цитата:

что в результате fadeOut элемент становится скрытым. И тут начинаются приколы
я и так и эдак уже.. хотя это заметил..

fadeTo оказывается... ну уж новичек я :o ф
да, тут как раз fadeTo и нужен получается по моей задумке.


еще раз спасибо за отклик!

SashaBorandi 20.02.2009 10:38

Я уже сталкивался с этой проблемой.. Решил вот так http://javascript.ru/forum/jquery/24...animaciya.html

x-yuri 20.02.2009 11:24

SashaBorandi, а это уже следующая проблема. О которой автор еще не знает
Я бы так сделал:
function onMouseEnterLeave( e ) {

	if( $.data(this, 'isRunning') )
		return;
	$.data( this, 'isRunning', true );
	var el = this;
	$(this).fadeTo(500, e.data, function() {
		$.data( el, 'isRunning', false );
	});
}
$("a img").bind("mouseenter", 0.1, onMouseEnterLeave);
$("a img").bind("mouseleave", 1, onMouseEnterLeave);

меня только беспокоит не будет ли утечек памяти. Может лучше сделать
function onMouseEnterLeave( e ) {

	if( $.data(this, 'isRunning') )
		return;
	$.data( this, 'isRunning', true );
	var id = this.id;
	$(this).fadeTo(500, e.data, function() {
		$.data( $('#'+id), 'isRunning', false );
	});
}
$("a img").bind("mouseenter", 0.1, onMouseEnterLeave);
$("a img").bind("mouseleave", 1, onMouseEnterLeave);

только id всем пунктам меню надо будет назначить

namez 22.02.2009 12:22

Цитата:

Сообщение от x-yuri (Сообщение 12945)
SashaBorandi, а это уже следующая проблема. О которой автор еще не знает
Я бы так сделал:
function onMouseEnterLeave( e ) {

	if( $.data(this, 'isRunning') )
		return;
	$.data( this, 'isRunning', true );
	var el = this;
	$(this).fadeTo(500, e.data, function() {
		$.data( el, 'isRunning', false );
	});
}
$("a img").bind("mouseenter", 0.1, onMouseEnterLeave);
$("a img").bind("mouseleave", 1, onMouseEnterLeave);

меня только беспокоит не будет ли утечек памяти. Может лучше сделать
function onMouseEnterLeave( e ) {

	if( $.data(this, 'isRunning') )
		return;
	$.data( this, 'isRunning', true );
	var id = this.id;
	$(this).fadeTo(500, e.data, function() {
		$.data( $('#'+id), 'isRunning', false );
	});
}
$("a img").bind("mouseenter", 0.1, onMouseEnterLeave);
$("a img").bind("mouseleave", 1, onMouseEnterLeave);

только id всем пунктам меню надо будет назначить

не совсем понял, не могли бы показать рабочий пример? (на основе моего)

сейчас у меня: (http://mmns.ru/files/moo2/)

$(document).ready(function(){

$("li a img").bind("mouseenter", function() {
    $(this).fadeTo(500, 0.1);
});
$("li a img").bind("mouseleave", function() {
    $(this).fadeTo(500, 1);
});

 	 });



<style>
img {border:0;}
ul {width:265px; height:79px}
ul li{float:left;  display:block}
#forum {height:23px; width:76px; background:url(images/forum_over.jpg) top left  no-repeat; }
#contact {height:23px; width:95px; background:url(images/contact_over.jpg) top left no-repeat;}
</style>

<ul><li id="forum"><a href="/forum" ><img src="images/forum.jpg" alt="" /></a></li><li id="contact"><a  href="/contacts" ><img src="images/contact.jpg" alt="" /></a></li></ul>


спасибо.

x-yuri 23.02.2009 13:20

а мои варианты - не рабочие? Их два, второй подразумевает назначение всем пунктам меню (img) атрибутов id

namez 23.02.2009 17:47

Цитата:

Сообщение от x-yuri (Сообщение 13070)
а мои варианты - не рабочие? Их два, второй подразумевает назначение всем пунктам меню (img) атрибутов id

сейчас попробую обьяснить -
применяю второй вариант, все тут же _mmns.ru/files/moo2/

наведение работает только с одним меню и без fade out

в общем не понял вас немножко где рабочий вариант, что забыл сделать?
про id что имеется в виду, если добавляю к картинкам id то не работает в таком случае fadeOut

и еще чтобы понять -
мы же говорим о зацикливании - то есть если мышкой много раз понаводить по менюшкам то эффект повторится n' раз?

спасибо за помощь тк я не понимаю в решении данной проблемы.

x-yuri 23.02.2009 18:13

namez, да, у меня во втором варианте ошибка: $('#'+id) -> $('#'+id)[0]
но ты разберись, как оно раотает, а то мало ли чего я тебе тут насоветовал ;-)

namez 23.02.2009 19:14

исправил но работает с глюками ведь все равно..
теперь зацикливания нету но остается fadeIn...

да и как без id к картинке обойтись - а если например там в li будет span c бекграундом? то есть конструкция вида <li><a href><span></span></a>

пытаюсь разобраться но пока глюк что-то на глюке у решения зацикливания 8(

x-yuri 23.02.2009 21:03

да, не учел еще один нюанс
function onMouseEnterLeave( e ) {
 
    var to = { mouseenter: 0.1, mouseleave: 1 };
    if( $.data(this, 'isRunning') ) {
        $.data( this, 'last', e.type );
        return;
    }
    $.data( this, 'isRunning', true );
    $.data( this, 'last', null );
    var id = this.id;
    var type = e.type;
    $(this).fadeTo(500, to[ e.type ], function() {
        var last = $.data($('#'+id)[0], 'last');
        if( last && (type != last) )
            setTimeout( function() {
                $('#'+id).trigger( last );
        }, 0 );
        $.data( $('#'+id)[0], 'isRunning', false );
    });
}
$("a img").bind("mouseenter", onMouseEnterLeave);
$("a img").bind("mouseleave", onMouseEnterLeave);

но стоит задуматься, а надо ли это вообще

x-yuri 23.02.2009 21:04

Цитата:

да и как без id к картинке обойтись - а если например там в li будет span c бекграундом? то есть конструкция вида <li><a href><span></span></a>
ну задашь id для span

namez 23.02.2009 22:21

да x-yuri теперь все вроде ок! спасибо бальшое =)

насчет задуматься если правильно понял вас:

вот реализация на mootools
http://mmns.ru/files/moo/

cкажите почему такая разница в кол-ве кода?

спасибо за помощь, с уважением Cергей.

x-yuri 23.02.2009 23:19

можно еще так (без id, заметь)
function onMouseEnterLeave( e ) {
 
    var to = { mouseenter: 0.1, mouseleave: 1 };
    if( $.data(this, 'isRunning') ) {
        $.data( this, 'last', e.type );
        return;
    }
    $.data( this, 'isRunning', true );
    $.data( this, 'last', null );
    var type = e.type;
    $(this).fadeTo(500, to[ e.type ], function() {
        var last = $.data( this, 'last');
        if( last && (type != last) ) {
			var img = this;
            setTimeout( function() {
                $(img).trigger( last );
        	}, 0 );
		}
        $.data( this, 'isRunning', false );
    });
}

а можно так
$("a img").bind("mouseenter", function() {
	$(this).stop().fadeTo(500, 0.1);
});
$("a img").bind("mouseleave", function() {
	$(this).stop().fadeTo(500, 1);
});


или аналог mootools-варианта
$("a img").bind("mouseenter", function() {
	$(this).stop().fadeTo(0, 1).fadeTo(500, 0.1);
});
$("a img").bind("mouseleave", function() {
	$(this).stop().fadeTo(0, 0.1).fadeTo(500, 1);
});

и собственно вопрос: "почему такая разница в количестве кода?" Но в любом случае сравнивать фреймворки надо не по количеству кода одной задачи

Под задуматься я подразумевал, что именно надо: 1) анимации выполняются все и до конца, 2) пропускаются промежуточные анимации, 3) очередное событие прерывает текущую анимацию, 4) очередное событие прерывает текущую анимацию и начинает новую с ее "начала" (mootools-вариант)


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