Jak wywołać zdarzenie mouseenter zależnie od wartości zmiennej.

0

witam,

a wiec mam taki sobie prosty kawałek kodu w jquery:


if(tmp ===1)
{
    $('.class').mouseenter(function()
    {
        // zrob cos
    }).mouseout(function()
    {
        // zrob cos
    });
}

w momencie, gdu zmienna tmp jest równa 1 chcę, żeby js wywołał kod znajdujący w if'ie.
kod może na to wskazywać, jednakże tak się nie dzieje. Nawet jeżeli tmp = 0 i tak działa kod,
który znajduje się w mouseenter lub odpowiednio mouseout. Jak mogę zakodować zależność
takiego eventu od zmiennej tmp?

jak wpiszę warunek do środka każdego z eventu, kod działa. Tyle, że takich eventów mam około 6 jak nie wiecej i tylko w jednej funkcji to szkoda nadpisywać tyle kodu.

próbowałem również z event.stopPropagation() oraz z .off(). ostatni funkcja zdejmuje event z drzewa dom, ale co z tego. ja nie chce go kompletnie wyłaczyć, ja chce go tylko wykonać jak tmp =1, dla reszty wartość zmiennej tmp nie chcę wywoływać eventu.

0

Dobra obszedłem problem. Napisałem niby klasę w js :D Wystawiłem zmienną jako globalna zmienna tmp. Tworze obiekt. var o = new mojaClassa();, następnie wywołuję o.tmp i sprawdzam czy zmienna jest równa 1. Jak tak to nakładam zdarzenie na element z drzewa DOM. nie podoba mi sie to maksymalnie, ale nie mam lepszego pomysłu. A ten pomysł z ifem środku każdego eventu jest jeszcze gorszy moim zdaniem.

chociaż z drugiej strony wszsytkie eventy powinny być wywoływane ze środka klasy, a nie na zewnątrz. Też porażka. Nie mam pojęcia...

0

Jednak dalej mam problem z eventami (mouseenter) w swojej "Klasie". Teraz jak najadę na element ze zdarzeniem mouseenter, następnie jeszcze raz. To kod ze środka mouseenter powtarza mi sie tyle razy ile najade na element DOM. W tym przypadku dwa razy. I zmienia trochę zmienne :( Nie kumam w ogóle jak mam w JS OOP poupychac te eventy. Jak one mają zostać zaprogramowane w obiektowym JS??

Próbowałem już z :


event.stopPropagation();
event.preventDefault();
that.baseName.removeData();
$(that.baseName + ' .next').unbind('mouseout');

i nic. irytuje już mnie te eventy. Jakie je zabić w sensowny pomysł w obiekcie JS?

Może problem jest przez to, że w kodzie używam prototypowania prototype ??

Wiem, gdzie leży problem. Tworze ogolnie plugin z kalendarzem. Mam strzałki z poprzednim i następnym miesiącem. Jak klikam np na następny miesiąc. To tworze event click i mam nowy kawałek kodu html klikam drugi raz na następny miesiąc i mam już drugie wywołanie eventu click czyli wykonuje ten sam kod dwa razy. wtf? wiem, że zle rozplanowałem położenie eventów w moim pluginie. Czy ktoś wie jak powinno poprawie rozlokować się eventy w pluginie?

Mimo, że jest to ta sama css klasa z jakiej zostaje wywołany event, ale jest to nowy kod html (nowy obiekt).

2

To było do przewidzenia. Szkoda, że w ogóle się nie uczysz, nie próbujesz zrozumieć jak to działa "pod spodem", tylko zbierasz jakieś fragmenciki, coś tam wiesz, piszesz bez zastanowienia - jak działa to rzut na produkcję i niech sobie wisi. Wnioski wyciągam z tego, że po takim czasie od siedzenia w webdev wciąż masz takie trywialne problemy.

Co niezrozumiałego jest w fakcie, że jak przypinasz zdarzenie do elementu, a następnie przypinasz je jeszcze raz - to wykonuje się ono dwa razy?

function p() { alert(1); }
$('#mojbutton').click(p);
$('#mojbutton').click(p);

Ten kod spowoduje pokazanie dwóch alertów po kliknięciu w dopasowany element i widzisz w tym coś dziwnego?

0

Kiedy zupełnie nie o to chodzi. Blisko, ale trochę nie o to.

<div class="next_month"> 
>>
</div>

$(document).on('click', '.next_month', function()
// rób coś ...
});

Kod wygląda mniej więcej jak ten powyżej. Wyobraź sobie kalendarz. Klikasz sobie w strzałki .next_month <ort>daj my</ort> na to 10 razy. I w moim kodzie event ten za każdym razem jest tworzony od nowa jak klikniesz otrzymasz nowy kod html z nowym ort!. Jeżeli kliknę 10 razy kod wykona się 10 razy. Bo mam dziesięć miesięcy. Wiem, że albo źle wywołuje eventy albo muszę unbindować po skończeniu pracy.

Nie powtarzam tego samego kodu jak Ci się wydaje. Tworze za każdym razem nowy obiekt, przez co każdy obiekt wywołuje <ort>ten samą</ort> metodę i z niej kod !! Wiem, że mogę użyć np unbind i po sprawie, ale wiem, że to nie jest dobre rozwiązanie. Jak ktoś pisał pluginy będzie wiedział jak umieścić eventy w JS OOP, żeby miało to ręce i nogi, ale okej olać to forum. Znajdę zaraz sam rozwiązanie. Sikam na to forum i na takich sarkastycznych ludzi jak Ty @dzek69. Nie znasz mnie, a oceniasz po pozorach. Jeżeli myślisz, że potrzebuję w ogóle Twojej pomocy i sam nie dam rady napisać to się grubo mylisz. Po co w ogóle przesiadujesz na tym forum? Jaki Ty masz z tego zysk czy cel? Bo na pewno nie pomoc innym.

0

W konstruktorze mojego kalendarza wywołuje metodę, która tworzy miesiąc (wraz z kodem template dla html). Natępnię, wywołuję metodę w której przechowuje wszystkie potrzebne eventy tj. event click do zmiany miesiąca. A zaraz po tym wywołuję metodę destroy, gdzie usuwam wszystkie dowiązania do miejsac w drzewie DOM z kórego został wywołany kalendarz. Wygląda to mniej więcej tak:


this.removeData();
this.unbind();
this.remove();
0

Powiedz komuś kawałek prawdy - brutalnej, ale czasem inaczej się nie da - niemniej - bez złośliwości - to się obrażą.

Z Twojego opisu wynika, że robisz dokładnie to, co mówię - ale skoro się obraziłeś to nie przyjmiesz tego do wiadomości, tylko dalej brniesz w jakieś opowiastki - z których i tak wynika to, co napisałem.

A w temacie: wiem, że nie dodajesz dwa razy tego samego kodu linijka pod linijką - po prostu powtarzasz bindujący kod z każdym kliknięciem. Oznaczaj sobie element - dowolnym sposobem - że posiada już takie zdarzenie - i więcej tego nie przypinaj. A najlepiej - tak jak się to robi - przypinaj zdarzenia raz w momencie inicjalizacji. Jeżeli elementy masz zmienne - przypinaj zdarzenia metodą on do elementu, który się nie zmienia (zazwyczaj jakiś nadrzędny element).

0

Eventy wywołuje tylko raz. Tak jak napisałeś zaraz po utworzeniu obiektu/instancji kalendarza. I używam .on('click').

0

Wrzuć tu cały kod (html+js, żebym mógł to uruchomić u siebie) to znajdziemy przyczynę

0

Kod wygląda tak: http://codetidy.com/6002/

Na górze po prawej masz link View Raw.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0