ugrás a tartalomhoz

Chrome $(window).load() probléma

whiteman0524 · 2011. Aug. 31. (Sze), 20.59
Sziasztok!

A címben is említett megoldással akadt problémám, ugyanis Chrome alatt sajnos nem működik jól. Arra kéne a függvény, hogy lekérjem egy bizonyos elem szélességét miután betöltődött (és megjelent!) a custom font, mert a vele írt szövegnek a szélességétől függ az elem hossza. A $(window).load() ugye akkor hívódik meg amikor minden letöltődött. Firefox és IE összes alatt jól működik a dolog de Chrome alatt nem mindig. Véletlenszerűen vagy jó vagy nem, de általában inkább nem. Tehát ha olyat írok hogy...

$(window).load(function(){
//Lekérem az elem szélességét
});

akkor Chrome alatt általában rossz eredményt ad, mert azelőtt fut le, mielőtt a kívánt elem felvenné a végleges szélességét, pedig elméletileg meg kéne hogy várja.

Próbáltam ezen kívül számtalan egyéb dolgot is, de egyik se volt tökéletes, mert valamelyik böngészőben probléma volt vele. Tehát az a lényeg hogy olyan megoldás kéne ami IE7+, FF3.6+, és Chrome ready is.

A segítséget előre is köszönöm. Hátha van valakinek egy jó ötlete :)
 
1

A kód végére, a </body> elé

Hidvégi Gábor · 2011. Aug. 31. (Sze), 21.05
A kód végére, a </body> elé szoktam betenni egy <script> tag-et, benne a hasonló jellegű kóddal, ez eddig mindig bevált.
3

Sajnos nekem ez nem működik.

whiteman0524 · 2011. Aug. 31. (Sze), 21.16
Sajnos nekem ez nem működik. De egyébként ez volt az első amit próbáltam :(
9

Mi történt ekkor? Nem futott

Hidvégi Gábor · 2011. Szep. 1. (Cs), 06.47
Mi történt ekkor? Nem futott le ez a script, hibát sem adott?
12

Nem adott semmilyen hibát.

whiteman0524 · 2011. Szep. 1. (Cs), 11.49
Nem adott semmilyen hibát. Egyszerűen nem működik úgy ahogy kéne. Pontosabban nem változtatott a dolgon, ahhoz képest mintha a header-ben húztam volna be a js fájlt-t.
2

$?

Poetro · 2011. Aug. 31. (Sze), 21.13
És azt azért elárulod, hogy mi a $? Mert sajnos az nem derült ki. Valamint jó lenne tudni, hogy pontosan mit is vársz el, azaz, mi az, hogy jó, és mi az hogy nem jó. Valamint mit jelent az, hogy
mielőtt a kívánt elem felvenné a végleges szélességét

Miért változik az elem szélessége?
4

Igen azt elfelejtettem

whiteman0524 · 2011. Aug. 31. (Sze), 21.31
Igen azt elfelejtettem említeni hogy JQuery-t használok, elnézést. Tehát ő az $.

Konkrétan egy <a> elemről van szó, aminek a betűtípusa egyedi font. A szélessége nem változik, DE meghatározza a benne levő szöveg szélessége. Ez azt jelenti hogy nem adtam neki fix szélességet, tehát ha például a font-family mondjuk Arial akkor az <a> elemnek van egy szélessége miután az oldal betöltődött. De ha más a font család akkor pedig megint más a szélessége, még ugyan olyan betűméret és stílus mellett is. Nyilván.

Tehát az <a> elem szélességét nem változtatom soha, de mielőtt megjelenne a kívánt betűtípussal a szöveg, a böngésző az alapértelmezettel írja ki a szöveget, és ezért az <a> elem szélessége mindaddig nem végleges amíg nem élnek a fontok. És ez itt a probléma.

Jó megoldásnak tartom azt, hogy mihelyt lehetséges dolgozhassak a megfelelő szélesség értékkel. Tehát az például nem jó megoldás hogy indítok egy setTimeout-ot és mondjuk várok 2-3 másodpercet mert addigra "biztosan" betöltődött minden. Ez nem jó megoldás.
5

Font

Poetro · 2011. Aug. 31. (Sze), 21.40
Ez sajnos ilyen lesz. Mivel a font betöltődése általában független a window onload eseményétől, azaz ezen nem tudsz javítani. Vagy pár dolgot tehetsz. Például a Firefox 3 másodpercet vár a betűtípus betöltésére, és ha az alatt nem kezd el betöltődni / nem töltődik be a betűtípus, akkor valami beépítettel teszi meg. Minden böngésző másképp viselkedik ezen a téren. Amit tehetsz, hogy a window onload eseménye után vársz még 3-5 másodpercet, és csak azután futtatod le a kódodat.

Egyébként, miért fontos hogy milyen széles? Nem lehet, hogy van valami más megoldás a problémádra, ami független attól, hogy milyen széles a doboz?
6

Hát igen. De semmiféle

whiteman0524 · 2011. Aug. 31. (Sze), 22.07
Hát igen. De semmiféle setTimeout-os megoldás nem játszik nálam, mert az egész vagy-vagy megoldás. Vagy bejön vagy nem, és ez számomra elfogadhatatlan :D

Egyébként van JQuery-hez .resize() plugin. Van beépített .resize() eseménykezelő is, de az csak a window objektummal működik. A plugin lehetőséget ad minden DOM elem kezelésére. Tehát megoldás lehetne az, hogy az elem átméreteződésekor szerzem be a szélességet. Sajnos ez se jó megoldás mert a plugin egyrészt felülírja a window objektum beépített .resize() eseményét a kompatibilitás megőrzése érdekében, amit én pont nem akarok mert nem szuperál olyan jól mint az eredeti (értsd túl lassú). Másrészt pedig az IE néha olyan gyorsan rajkja ki a fontokat, hogy nincs is átméreteződés, mert már eleve jó az elem szélessége. Ez utóbbira megoldás lehet az, hogy DOM betöltődés után lekérem a szélességet, majd átméreteződéskor újra és újraszámolok vele. De ez megint nem jó, mert a szélesség egy másik elem pozicionálásához kell, amit ha adott esetben kétszer pozicionálok akkor az elég ronda lesz(villogás), és ez is a nem elfogadható megoldások táborát gyarapítja nálam, ahogy az is, hogy "hagyjuk a Chrome-ot a fenébe mert azzal a pár százalékával úgyse mérvadó a böngészőpiacon" :)
7

26%

Poetro · 2011. Aug. 31. (Sze), 22.09
Azért a magyar piacon elfoglalt 26%-ot nem venném kicsinek. Mondjuk a világon "csak" 22%. De kicsire nem adunk a nagy meg nem számít?
8

Akkor én kicsit le vagyok

whiteman0524 · 2011. Aug. 31. (Sze), 22.29
Akkor én kicsit le vagyok maradva :D Na mindegy. A problémát sajnos nem fogja megoldani a Chrome piaci részesedése.
10

Loading...

zzrek · 2011. Szep. 1. (Cs), 08.29
Akkor tegyél ki egy "loading..." ablakot, mögé tegyél egy (eltakart) tesztszöveget és annak vizsgáld a méretét úgy, hogy beleteszel standard betűvel valamit, leméred, majd javascripttel megváltoztatod a fontstílust rajta. Ezekután tizedmásodpercenként megméred a méretét újra és újra és ha felvette az új alakját, akkor leveszed a "loading" feliratot és kirakod a tartalmat. (Le kell kezelni azt is persze, hogyha x ideig nem akar változni semmi sem). Ezzel minden "vagy-vagy" megoldást kiszűrhetsz.
13

Ezt a megoldást is próbáltam

whiteman0524 · 2011. Szep. 1. (Cs), 11.57
Ezt a megoldást is próbáltam már. De ez se működik jól, pedig elméletileg jó :) Azért nem működik, mert azt gondolná az ember hogy ilyen esetekben két szélessége lehet az elemnek. Kezdetben amikor még nincs font betöltve akkor x, ha pedig betöltődött a font akkor y és készen is vagyunk. De az a helyzet, hogy x és y között előfordulhat tapasztalataim szerint z szélesség is (tehát ez nem egy bináris dolog), amire az általad említett megoldás egyből ráugrana az első változáskor ami lehet akár z is, tehát megint csak rossz értéket adna vissza nem pedig azt amire szükségem van. És mivel rugalmas akarok lenni, ezért nyilván nem ismerem a végső szélesség értéket, tehát nem tudok rá konkrétan tesztelni.
15

nekem is

zzrek · 2011. Szep. 1. (Cs), 12.26
Nekem is csinálta ezt, főleg IE alatt, hogy oda-vissza váltogatta a betűtípust, míg aztán megállapodott. De ott a css-t egyéb szempontból is változtattam, ha jól emlékszem abban az esetben ha már mindent betöltöttél, és utána változtatod pusztán annak a tételnek a fontbeállítását, akkor csak egyszer fog változni. Arra kell figyelni, hogy a betöltés előtti és a betöltendőhöz tartozó fallback fontkészlet ugyanaz legyen. (De nem vagyok benne biztos hogy 100% hogy ebben az esetben csak 1 váltás lesz)
16

Igen, én már eleve így

whiteman0524 · 2011. Szep. 1. (Cs), 14.06
Igen, én már eleve így próbáltam a dolgot. De nem volt jó így se. Ugyan az a szitu :S
11

...

carstepPCE · 2011. Szep. 1. (Cs), 10.37
esetleg nincs a font betoltesnek letoltes vege esemenye, arra talan jobban lehetne tamaszkodni. Nem ertek a font betolteshez, csak gondoltam hatha.

Udv
14

Hát igen. Ez lenne a legjobb

whiteman0524 · 2011. Szep. 1. (Cs), 12.11
Hát igen. Ez lenne a legjobb megoldás, csak sajnos ilyen esemény nem létezik :) Most tesztelem amúgy a Google WebFont Loader-t, ez az utolsó reményem remélem működni fog. Majd megírom a tapasztalataimat.
17

Nos kipróbáltam a Google

whiteman0524 · 2011. Szep. 1. (Cs), 14.07
Nos kipróbáltam a Google WebFont Loader-t is, ami egy igen jó cuccnak ígérkezett, csak egyetlen baja van hogy nem működik vagy pedig elég rapszodikusan. Chrome alatt látszólag jó, Firefox alatt nem mindig de többnyire igen, IE alatt pedig szinte egyáltalán nem működnek bizonyos funkciói, mint például scriptek futtatása amikor bizonyos fontok, vagy az összes letöltődött (pont ami nekem kéne)...

JavaScript Guru kerestetik! Help please :D
18

Próbáljuk meg azt, hogy

deejayy · 2011. Szep. 1. (Cs), 14.08
Próbáljuk meg azt, hogy leírod, hogy pontosan mire kell ez a funkció, hátha tudunk kerülőmegoldást.
19

Próbáljuk

whiteman0524 · 2011. Szep. 1. (Cs), 16.00
Közben tovább teszteltem a WebFont Loader-t és most talán sikerült összehozni a lehetetlen-t de még nem bízok benne teljesen. Úgy néz ki hogy nem mindegy hogy hogy használja az ember. Ahogy a dokumentáció is írja lényegében két módon lehetséges a használata, bár nem vagyok vele 100%-osan tisztában hogy az egyik módszer miért nem működik nekem személy szerint jól. A dokumentáció itt található. Mindjárt az oldal tetején a A quick example alcím alatt le is van írva a két megoldás. Én eddig az első módszerrel próbálkoztam de mint ahogy korábban is említettem ez nem működött mindig jól. Most viszont megnéztem a második Ajax-os megoldást is, és ezzel egyelőre nem sikerült hibás eredményeket produkálnom.

Ha valaki esetleg használta már ezt a WebFont Loader-t, vagy teljes mértékben tisztában van a két módszer működésbeli különbségével annak hálás lennék ha elmagyarázná hogy nekem miért csak a második módszer működik jól. Előre is köszönöm szépen.

Amire a funkciót használni szeretném

Lényegében egy menü-höz kellenének a szélesség értékek. Itt egy kép a vázáról. Tehát egy sima listáról van szó, ami display: inline tulajdonságú (mármint a <li> elemek), tehát úsztatva vannak szépen egymás mellé az egyes lista elemek. A szélességük attól függ hogy milyen hosszú a bennük található szöveg, ezt próbáltam is illusztrálni a második sorban. A kis háromszögek a linkek/menüelemek alatt az éppen aktív elemet jelzik, vagyis azt az oldalt ahol éppen a felhasználó tartózkodik. A desing miatt így szeretném megoldani az aktuális oldal kiemelését, tehát most tegyük félre a csináljam másképp ötleteket, mert én így szeretném megoldani :) Az a kis háromszög, egy külön <div> elem ami fix szélességű és horizontálisan mindig az aktuális oldal linkje alá van pozicionálva középre. Sokat agyaltam de ezt JavaScript nélkül nem igen lehet megoldani ezért is folyamodtam hozzá. Szóval a lényeg az, hogy ami egyedül ismert az a legelső link kezdetének az x koordinátája, tehát az offset().left tulajdonsága (JQuery-ben), de a szélessége ugyan úgy, ahogy a többi link szélessége és x koordinátája sem ismert a speciális font miatt, amitől függnek ezen értékek. Nekem tehát két dologra van szükségem, az aktív link x koordinátájára és a szélességére hogy az oldal jelölő kis háromszöget megfelelően alá tudjam pozícionálni. De ez csakis azután lehetséges miután a fontok betöltődtek és megjelentek.
20

...

carstepPCE · 2011. Szep. 1. (Cs), 16.36
melyebben belegondolas nelkul, nekem elsore a inkabb a link elemekhez alkalmazott relativ pozicio (CSS) biztosan megoldja a problemadat
22

Elvész a lényeg

whiteman0524 · 2011. Szep. 1. (Cs), 18.00
Oké. Tegyük fel hogy relatívan pozícionálok a menü elemkhez képest. Nah és pontosan mennyi az a relatív érték ? :)
21

A fenti alapján valami

Poetro · 2011. Szep. 1. (Cs), 17.10
A fenti alapján valami ilyesmit tudtam elképzelni, lehet tévedek.
23

Hát ööö... Nem tudom. Hogy

whiteman0524 · 2011. Szep. 1. (Cs), 18.13
Hát ööö... Nem tudom. Hogy jóra gondoltál-e, ebből túl sok nem derül ki számomra. De szerintem nem voltam elég világos. Nah majd most :) Szóval itt egy kép hogy miről is beszélek igazából. Tehát a háromszög fix hosszúságú, és a link amit jelöl az lehet nála keskenyebb, és lehet nála szélesebb is. A lényeg, hogy pontosan a jelölt link alatt legyen középen.
24

Ez teljesül

Poetro · 2011. Szep. 1. (Cs), 18.15
Az én példámban ez teljesül. A nyíl fix szélességű és pontosan középen van minden esetben.
25

És ez működik akkor is ha a

whiteman0524 · 2011. Szep. 1. (Cs), 18.17
És ez működik akkor is ha a háromszög szélesebb mint a linkek? Ha igen akkor hogy csináltad?
26

Eleve ott a kód, nincs benne

Poetro · 2011. Szep. 1. (Cs), 18.19
Eleve ott a kód, nincs benne semmi JS, a lényeg:
#navigation .arrow {
    font-size: 0px;
    line-height: 0%;
    width: 0px;
    position: absolute;
    left: 50%;
    bottom: -10px;
    margin-left: -20px;
    border-top: 8px solid #666;
    border-left: 20px solid transparent;
    border-right: 20px solid transparent;
}

#navigation .collapsed {
    position: relative;
    float: left;
    margin: 0 10px;
    padding: 3px 0 0;
    font-size: 1.143em;
    font-family: Volkhov, Arial, sans-serif;
}
27

Tökéletes megoldás!

whiteman0524 · 2011. Szep. 1. (Cs), 19.51
Én mindig csak vagy position: relative-ban vagy pedig position: absolute-ban gondolkodok. De elfelejtem hogy a kettőt kombinálni is lehet. És tényleg :) Köszönöm szépen. Hát ez nagyon jó, akkor JS kilőve. Mindenkinek köszönöm szépen a segítséget, neked külön is, továbbá deejayy kollégának is. Igaza van, tényleg ezzel kellett volna kezdeni a probléma megfogalmazást nem pedig a JS-el. És így sajnos a cím se helytálló...