ugrás a tartalomhoz

setTimeout(fn, 0);

asam9 · 2017. Jan. 31. (K), 00.07
Sziasztok,

Egy függvényben azt ellenőrzöm, hogy az adott elem scrollWidth értéke nagyobb-e, mint ugyanennek az elemnek a clientWidth értéke és ennek függvényében hozzáadódik egy class a szülőelemhez, ami módosítja az elrendezést. Ez resize eseményre tökéletesen megvalósul.
Ha azonban a nézetváltáshoz közeli szélességnél frissítem az oldalt, mikor a scrollWidth-nek már nagyobbnak kellene lennie, akkor is egyformának veszi a két értéket (kb. 5-10 pixelig érzékeli rosszul). Amikor beraktam a setTimeout(fn, 0); utasítást, utána tökéletesen működött.
Azt szeretném megtudni, hogy ez a ronda megoldás miképpen működik a háttérben, és hogy esetleg van-e ötlet a setTimeout használatának elkerülésére.
 
1

Használsz jQueryt, Angulart,

smokey · 2017. Jan. 31. (K), 12.56
Használsz jQueryt, Angulart, vagy valami hasonlót? Elképzelhető, hogy egy releváns elem bizonyos tulajdonságát módosító javascriptes függvény később fut le, minthogy elvégzed az osztály hozzáadását.

Ha reszponzivitás miatt csinálod ezt, akkor szerintem használj media queryt.
4

jQuery-t használok, de a

asam9 · 2017. Jan. 31. (K), 19.00
jQuery-t használok, de a függvényen belül nem használtam, mert csak class hozzáadás/eltávolítás van. A reszponzivitás miatt csinálom, igen :) Media Query-ket használok legtöbb esetben, de itt pl. jobban kedvelem ezt a megoldást, mert így pontosan akkor változik a nézet, amikor szükséges (amíg a tab fülek kiférnek).
2

Új "szál" indul

T.G · 2017. Jan. 31. (K), 14.38
Ilyenkor egy új "szál" indul, azaz a futás akkor kezdődik, amikor az adott szakasz befejeződik.
Az alábbi példában nézd meg az egyik, illetve másik verziót és látni fogod, hogy mire is jó ez.

var i = 0;

function fn () {
  console.log(i);
}

function fn1 () {
  // fn();
  setTimeout(fn, 0);
  i++;
}

fn1();
(Oké, nem pontosan fogalmazok, JS-ben nincsenek szálak)
3

Jah, nevezzük inkább

smokey · 2017. Jan. 31. (K), 15.22
Jah, nevezzük inkább aszinkron folyamatnak.
5

Köszönöm a magyarázatot! Az

asam9 · 2017. Jan. 31. (K), 19.02
Köszönöm a magyarázatot! Az adott szakasz alatt itt az fn1 hatókörét kell érteni?
6

Lehet, hogy nem véletlenül

asam9 · 2017. Jan. 31. (K), 23.20
Lehet, hogy nem véletlenül volt kérdés, hogy jQuery-t használok-e, szóval ez tulajdonképpen egy jQuery plugin. Egyébként azért furcsa, hogy kell neki a setTimeout, mert az init függvény legvégére van helyezve a függvényhívás.
Szóval a fenti példára vonatkoztatva nálam valami ilyesmi történik:
var i = 0;  
  
function fn () {  
  console.log(i);  
}  
  
function fn1 () {
   i++;
   setTimeout(fn, 0);
}  
  
fn1(); 
(Ez az elvi példa persze működik setTimeout nélkül is)
7

Még több ok is lehet...

T.G · 2017. Feb. 2. (Cs), 00.20
Ezt bárhol lehet használni, nem kötődik a JQuery-hez.
A setTimeout(fn, 0); -nak más mellékhatása is van, nem csak a fenti példa. Pl. egy for ciklusban folyamatosan változtatod egy elem pozícióját, akkor a böngésző beoptimalizálja azt neked és csak a futás végén kerül az elem a megfelelő helyre. Néha előfordulhat, hogy a böngésző túloptimalizálja magát és ilyenkor jó, ha ki tudjuk ezt valahogy cselezni.
Én ott találkoztam ennek a hasznosságával, amikor canvas-re rajzoltam: http://stack.hu/mandelbrot/ Ha a függvény végén meghívtam volna simán a run(); metódust, akkor csak a végeredményt láttam volna, ellenben így (setTimeout(run);) folyamatosan növekszik a piros csík.
8

Kipróbáltam, tényleg a

asam9 · 2017. Feb. 2. (Cs), 00.43
Kipróbáltam, tényleg a leírtak szerint működik setTimeout nélkül. Akkor marad ez a ronda, de hasznos megoldás :) Köszönöm még egyszer a segítséget!