• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Jednorazowe wykonanie sie funkcji w js

0 głosów
1,978 wizyt
pytanie zadane 31 października 2017 w JavaScript przez bulgotnik86 Gaduła (3,040 p.)
Mam funkcję , która zmienia właściwości css ,elementu html. Wywoływana jest na $(window).scroll. Chcę aby po jednorazowym wykonaniu sie , zakończyła swoje działanie. Żeby na scrollowanie  ponownie sie nie wywoływała. Jest cos takiego wykonalne? Ktoś pomoże? Z góry dzięki

3 odpowiedzi

+3 głosów
odpowiedź 31 października 2017 przez Comandeer Guru (607,330 p.)

Jest coś takiego jak $.fn.one, czyli wywołanie danego event listenera raz, po czym odpięcie go. To samo można osiągnąć przy pomocy opcji once dla addEventListener.

+2 głosów
odpowiedź 31 października 2017 przez kap Stary wyjadacz (11,620 p.)

Możesz zrobić np tak, lepiej niż ustawiać niepotrzebnego globala:
 


function oneTime () {
  if (oneTime.done) {
    return
  }

  oneTime.done = true
  // do main stuff, for example
  console.log('doing stuff')
}

 

Chociaż w Twoim przypadku lepiej po prostu usunąć podpięty event listener - no bo po co ma się ta funkcja w ogóle odpalać i sprawdzać warunek?

komentarz 31 października 2017 przez bulgotnik86 Gaduła (3,040 p.)
Też dobre, i tak i tak se zrobie dla treningu. Wielkie dzięki
0 głosów
odpowiedź 31 października 2017 przez lb478 Użytkownik (940 p.)

Ustaw warunek.
1. Zmienna globalna typu boolean (przy deklaracji przyjmuje wartość true)
2. W ciele funkcji ustaw zmianę własności CSS w warunku gdzie jest sprawdzana zmienna z pkt.1.
3. Po zmianie własności zmień tą zmienna globalną na false.
4. Zmiana nie wywoła się ponownie, bo false.

Mam nadzieję że to w miarę jasno wyjaśniłem :)

komentarz 31 października 2017 przez bulgotnik86 Gaduła (3,040 p.)
Zajebiste dzieki , wszystko jasne. Już coś takiego widziałem kiedyś ale se o tym zapomniałem. Jeszcze raz dzięki
1
komentarz 31 października 2017 przez Tomek Sochacki Ekspert (227,490 p.)

Zmienna globalna typu boolean

hmm, lepiej unikać zmiennych globalnych. Wg mnie lepszy jest sposób Comandeer'a i wywołanie:

element.addEventListener( 'scroll', () => {
    //funkcja na scroll
}, { once: true } );

 

komentarz 31 października 2017 przez bulgotnik86 Gaduła (3,040 p.)
Dzięki, ale czy mógłbyś (jak Ci sie oczywiscie chce) troszke bardziej pojaśnić ten kawałek kodu? Nie bardzo go rozumiem...
1
komentarz 31 października 2017 przez Tomek Sochacki Ekspert (227,490 p.)
(1) element.addEventListener( 
(2)   'scroll', 
(3)    () => {
(4)        //funkcja na scroll
(5)    }, 
(6)    { once: true } 
(7) );

1 - pod element DOM podpinamy...

2 - ...zdarzenie "scroll" (scroll, nigdy onscroll !)

3, 4, 5 - tutaj jest funkcja wywoływana na to zdarzenie

6 - ustawiamy opcje dla addEventListener, tutaj akurat tylko once, co oznacza, że zdarzenie zostanie obsłużone tylko raz, a potem zostanie odpięte od "element". Jest to inne spojrzenie na Twój problem. Nie chodzi tu o jednokrotne wywołanie funkcji ale o jednokrotne obsłużenie zdarzenia. Jest to lepsze rozwiązanie, ponieważ za chwilę możesz stwierdzić, że ta sama funkcja może zostać przypięta do dwóch różnych elementów i dla każdego z nich ma być wywołana tylko raz. Jeśli zastosujesz metodę ze zmienną globalną to każde kolejne wywołanie funkcji nie spowoduje miany CSS, bo już raz została ona wywołana, na co wskazuje zmienna = np. false. W tej metodzie (addEventListener once) jeśli podepniesz funkcję X do dwóch różnych elementów i w obu wypadkach dasz opcję one:true to dla każdego z nich wywoła się tylko raz (a dokładniej zdarzenie będzie wywołane tylko raz). I co więcej, masz możliwość np. dla elementu X wywołania jeden raz (once:true), ale dla elementu Y wywoływanie wielokrotne (once:false - wartość domyślna).

7 - nawias kończący addEventListener (jak już ponumerowałem to opiszę :P)

Nie wiem czy wystarczająco jasno opisałem o co mi chodziło, w razie czego daj znać to ujmę to jakoś inaczej :)

Podobne pytania

+1 głos
1 odpowiedź 252 wizyt
pytanie zadane 16 listopada 2022 w JavaScript przez mi-20 Stary wyjadacz (13,250 p.)
0 głosów
1 odpowiedź 373 wizyt
0 głosów
3 odpowiedzi 2,584 wizyt
pytanie zadane 22 maja 2015 w JavaScript przez ssnake Obywatel (1,860 p.)

93,604 zapytań

142,529 odpowiedzi

322,997 komentarzy

63,092 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Kursy INF.02 i INF.03
...