🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.javascript
7 messages
7 total messages Started by alianora Fri, 09 Oct 2009 09:26
prototype observe - problem z zagnieżdżonymi elementami
#49436
Author: alianora
Date: Fri, 09 Oct 2009 09:26
44 lines
1975 bytes
Witam,

Mam taki element na stronie:
<div id="F227" class="drop_img">
	<div id="ed_F227" class="drop_menu"></div>
	<div id="edb_F227" class="drop_edb"/></div>
</div>

i potem taki kod JS (fragment):

observeImgDrop : function(elem) {
   $('F227').observe('mouseover',this.dropImgMouseOver.bind(this));
   $('F227').observe('mouseout', this.dropImgMouseOut.bind(this));
   return true;
},

dropImgMouseOver : function(e) {
   Event.stop(e);
   Event.element(e).className = 'drop_img_hover';
   return true;
},
		
dropImgMouseOut : function(e) {
   Event.stop(e);
   Event.element(e).className = 'drop_img';
   return true;
},

Pierwszy problem w tym, że Event.element(e) zwraca wewnętrznego DIVa.
Niby obszedłem to czymś takim:

var id = Event.element(e).id.split('_');
id = id[id.length-1];
$(id).className = 'drop_img_hover';

(wiem, mało eleganckie) ale pojawia się drugi problem: przesuwając 
kursor myszy między wewnętrznymi DIVami powoduje generowanie zdarzeń 
mouseout i mouseover co powoduje denerwujące migotanie.

Jak to zrobić dobrze? Gdzie tkwi mój błąd?
Proszę o w miarę łopatologiczne wyjaśnienie bo nie jestem ekspertem od JS...

Pozdrawiam,
MK
Re: prototype observe - problem z zagnieżdżonymi elementami
#49437
Author: keemor
Date: Fri, 09 Oct 2009 11:13
68 lines
3098 bytes
On 9 Paź, 11:26, alianora <alian...@go2.pl> wrote:
> Witam,
>
> Mam taki element na stronie:
> <div id="F227" class="drop_img">
>         <div id="ed_F227" class="drop_menu"></div>
>         <div id="edb_F227" class="drop_edb"/></div>
> </div>
>
> i potem taki kod JS (fragment):
>
> observeImgDrop : function(elem) {
>    $('F227').observe('mouseover',this.dropImgMouseOver.bind(this));
>    $('F227').observe('mouseout', this.dropImgMouseOut.bind(this));
>    return true;
>
> },
>
> dropImgMouseOver : function(e) {
>    Event.stop(e);
>    Event.element(e).className = 'drop_img_hover';
>    return true;
>
> },
>
> dropImgMouseOut : function(e) {
>    Event.stop(e);
>    Event.element(e).className = 'drop_img';
>    return true;
>
> },
>
> Pierwszy problem w tym, że Event.element(e) zwraca wewnętrznego DIVa.
> Niby obszedłem to czymś takim:
>
> var id = Event.element(e).id.split('_');
> id = id[id.length-1];
> $(id).className = 'drop_img_hover';
>
> (wiem, mało eleganckie) ale pojawia się drugi problem: przesuwając
> kursor myszy między wewnętrznymi DIVami powoduje generowanie zdarzeń
> mouseout i mouseover co powoduje denerwujące migotanie.
>
> Jak to zrobić dobrze? Gdzie tkwi mój błąd?
> Proszę o w miarę łopatologiczne wyjaśnienie bo nie jestem ekspertem od JS...

Nie uzywaj w tym miejscu bind, tylko:

observeImgDrop : function(elem) {
   $('F227').observe('mouseover',this.dropImgMouseOver);
   $('F227').observe('mouseout', this.dropImgMouseOut);
    return true;

},

wtedy wewntarz tej metody, this zawsze odnosi sie do elementu, na
ktorym jest zarejestrowane zdarzenie

dropImgMouseOver : function(e) {
   e.stop();
   //to powinno zalatwic migotanie
  if (!this.hasClassName('drop_img_hover')) {
     this.addClassName('drop_img_hover');
  }
},

pozdrawiam
keemor.com
Re: prototype observe - problem z zagnieżdżonymi elementami
#49438
Author: alianora
Date: Fri, 09 Oct 2009 11:25
31 lines
1908 bytes
keemor pisze:
> On 9 Paź, 11:26, alianora <alian...@go2.pl> wrote:
> Nie uzywaj w tym miejscu bind, tylko:
> 
> observeImgDrop : function(elem) {
>    $('F227').observe('mouseover',this.dropImgMouseOver);
>    $('F227').observe('mouseout', this.dropImgMouseOut);
>     return true;
> 
> },
W tym konkretnym przypadku mogę tak zrobić bo wewnątrz funkcji 
obsługujących hovera nie muszę używać zmiennych czy funkcji z klasy.
Gdyby tak było miałbym problem.

> 
> wtedy wewntarz tej metody, this zawsze odnosi sie do elementu, na
> ktorym jest zarejestrowane zdarzenie
> 
> dropImgMouseOver : function(e) {
>    e.stop();
>    //to powinno zalatwic migotanie
>   if (!this.hasClassName('drop_img_hover')) {
>      this.addClassName('drop_img_hover');
>   }
> },

Dzięki za to. Pozostał drugi problem - podwójne generowanie zdarzenia w 
momencie przesuwania kursora pomiędzy wewnętrznymi DIVami :(

Pozdrawiam,
MK
Re: prototype observe - problem z zagnieżdżonymi elementami
#49439
Author: keemor
Date: Fri, 09 Oct 2009 11:30
41 lines
2609 bytes
On 9 Paź, 13:25, alianora <alian...@go2.pl> wrote:
> keemor pisze:> On 9 Pa , 11:26, alianora <alian...@go2.pl> wrote:
> > Nie uzywaj w tym miejscu bind, tylko:
>
> > observeImgDrop : function(elem) {
> >    $('F227').observe('mouseover',this.dropImgMouseOver);
> >    $('F227').observe('mouseout', this.dropImgMouseOut);
> >     return true;
>
> > },
>
> W tym konkretnym przypadku mog tak zrobi bo wewn trz funkcji
> obs uguj cych hovera nie musz u ywa zmiennych czy funkcji z klasy.
> Gdyby tak by o mia bym problem.
Wtedy z  pomocą przychodzi:
http://api.prototypejs.org/dom/event.html#findelement-class_method
var div = e.findelement('#F227')
>
>
>
> > wtedy wewntarz tej metody, this zawsze odnosi sie do elementu, na
> > ktorym jest zarejestrowane zdarzenie
>
> > dropImgMouseOver : function(e) {
> >    e.stop();
> >    //to powinno zalatwic migotanie
> >   if (!this.hasClassName('drop_img_hover')) {
> >      this.addClassName('drop_img_hover');
> >   }
> > },
>
> Dzi ki za to. Pozosta drugi problem - podw jne generowanie zdarzenia w
> momencie przesuwania kursora pomi dzy wewn trznymi DIVami :(

Zrob przyklad tutaj: http://jsbin.com

>
> Pozdrawiam,
> MK

keemor.com
Re: prototype observe - problem z zagnieżdżonymi elementami
#49442
Author: alianora
Date: Fri, 09 Oct 2009 11:33
20 lines
1482 bytes
alianora pisze:
>> dropImgMouseOver : function(e) {
>>    e.stop();
>>    //to powinno zalatwic migotanie
>>   if (!this.hasClassName('drop_img_hover')) {
>>      this.addClassName('drop_img_hover');
>>   }
>> },
> 
> Dzięki za to. Pozostał drugi problem - podwójne generowanie zdarzenia w 
> momencie przesuwania kursora pomiędzy wewnętrznymi DIVami :(

A już nie miga :D

zamiast this.className ='klasa' użyłem addClassName() i 
removeClassName() i jest już tak, jak chciałem.
Wielkie dzięki!

Pozdr,
MK
Re: prototype observe - problem z zagnieżdżonymi elementami
#49440
Author: alianora
Date: Fri, 09 Oct 2009 11:44
21 lines
1939 bytes
keemor pisze:
> On 9 Paź, 13:25, alianora <alian...@go2.pl> wrote:
>> keemor pisze:> On 9 Pa , 11:26, alianora <alian...@go2.pl> wrote:
>>> Nie uzywaj w tym miejscu bind, tylko:
>>> observeImgDrop : function(elem) {
>>>    $('F227').observe('mouseover',this.dropImgMouseOver);
>>>    $('F227').observe('mouseout', this.dropImgMouseOut);
>>>     return true;
>>> },
>> W tym konkretnym przypadku mog tak zrobi bo wewn trz funkcji
>> obs uguj cych hovera nie musz u ywa zmiennych czy funkcji z klasy.
>> Gdyby tak by o mia bym problem.
> Wtedy z  pomocą przychodzi:
> http://api.prototypejs.org/dom/event.html#findelement-class_method
> var div = e.findelement('#F227')
A co jak nie znam ID bo mam na stronie kilka takich zagnieżdżonych 
bloków? W tym przykładzie mogę sobie ID wyznaczyć bo powtarza się 
wspólny element ale nie zawsze tak będzie.

Pozdr,
MK
Re: prototype observe - problem z zagnieżdżonymi elementami
#49441
Author: keemor
Date: Fri, 09 Oct 2009 12:00
44 lines
2820 bytes
On 9 Paź, 13:44, alianora <alian...@go2.pl> wrote:
> keemor pisze:> On 9 Paź, 13:25, alianora <alian...@go2.pl> wrote:
> >> keemor pisze:> On 9 Pa , 11:26, alianora <alian...@go2.pl> wrote:
> >>> Nie uzywaj w tym miejscu bind, tylko:
> >>> observeImgDrop : function(elem) {
> >>>    $('F227').observe('mouseover',this.dropImgMouseOver);
> >>>    $('F227').observe('mouseout', this.dropImgMouseOut);
> >>>     return true;
> >>> },
> >> W tym konkretnym przypadku mog tak zrobi bo wewn trz funkcji
> >> obs uguj cych hovera nie musz u ywa zmiennych czy funkcji z klasy.
> >> Gdyby tak by o mia bym problem.
> > Wtedy z  pomocą przychodzi:
> >http://api.prototypejs.org/dom/event.html#findelement-class_method
> > var div = e.findelement('#F227')
>
> A co jak nie znam ID bo mam na stronie kilka takich zagnieżdżonych
> bloków? W tym przykładzie mogę sobie ID wyznaczyć bo powtarza się
> wspólny element ale nie zawsze tak będzie.
>
> Pozdr,
> MK

Ja to robie tak:

var Test = {
init: function() {
$$('.class').invoke('observe','click',this.click);
}
click: function(e){
e.stop();
//this to klikniety element
this.addClassName('foo');
Test.other();
},
other: function(){
//tu this odnosi sie do Test
}
}
document.observe('dom:loaded', Test.init.bind(Test));

Wiecej o bind
http://keemor.com/2009/05/25/javascript-this-bind/
http://keemor.com/2009/06/01/javascript-this-bindaseventlistener/
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads