Autor Zpráva
Suta
Profil
Když jsem se s problémem setkal poprvé při vytváření menu poháněného javascriptem, říkal jsem si, že zřejmě někde něco "nesprávně" zanořuji a problém jsem odložil s tím, že se k němu v budoucnu vrátím a zkusím kód přepracovat. Když jsem se však nyní setkal se stejným problémem u zcela jiného kódu, začínám se bát, zda-li u programování vydržím nebo si raději rychle začnu hledat jiný koníček...

Myslím, že nejlepší bude prakticky v bodech. Testujte ve Firefoxu !!!, v ostatních prohlížečích byste na problém narazili po daleko další době, tedy museli byste provádění níže uvedených operací věnovat např. 5 minut.

-----------------------------------------------------------------------------------------------------------------
1. Otevřete odkaz http://petrzavicak.cz/editor/menu_hotovo/menu_uprava.html
2. Vpravo nahoře jsou tři tlačítka, důležité jsou teď dvě šipky zcela vpravo (klasická bílá z windows a dvojitá černá)

Proveďte tyto dvě operace, můžete provést několikrát opakovaně:

3. Kliknutím na bílou šipku zobrazíte (a opět skryjete) nové okno s údaji o pohybu myši.
4. Kliknutím na černou šipku zobrazíte (a opět skryjete) lištu s menu.

V této fázi by měl efekt "vytracení" a "zobrazení" prvků probíhat plynule a rychle. Nyní proveďte následující operaci:

5. Rozlikněte menu, např. kliknutím na první záložku "Editor". Poté přejíždějte přes ostatní záložky menu a otevírejte či skrývejte jiná submenu. Provádějte cca 20 vteřin.
6. Poté znovu klikněte na jednu ze šipek a sledujte, jak "strnule" a se zadrháváním probíhá efekt vytracení / zobrazení okna s pohybem myši či zobrazení / skrytí lišty menu nyní.
-----------------------------------------------------------------------------------------------------------------

Netuším, v čem může být chyba. Menu a zobrazení nového okna s pohybem myši mají zcela rozdílný a na sobě nezávislý kód, přitom se při opakovaném "provádění operací" i třeba s jedním prvkem jakoby zaplňovala nějaká "operační paměť?" prohlížeče...

Pokud stránku načtete znovu, problém zmizí, nicméně budete-li např. pracovat s menu, s přibývajícím počtem otevření a skrytí jednotlivých submenu budou tyto operace probíhat stále pomaleji, až se např. po třech minutách dostanete do fáze, kdy prohlížeč přestane komunikovat zcela...

Problému nerozumím. Vůbec nevím, čeho by se mohl týkat. Zda-li špatně navrženého kódu, pak nevím, co by mělo být sestrojeno špatně... Pokud se někdo setkal s něčím podobným, budu vděčný za radu.
fajzen
Profil
Problém bude asi v náročnosti aplikácie... Testoval som na AMD Turion 2,2Ghz, Firefox 3.5.2. Samotné zobrazovanie polohy myši vyťažovalo procesor na cca 50%, skrývanie a odkrývanie asi na 30%, dokonca keď som sa prepol do inej karty prehliadača, bol procesor vyťažený na 100% nepretržite... Potom sa nie je čomu diviť, že ak má človek slabší stroj alebo nebodaj pustené mp3, či iný program, má prehliadač problémy to utiahnuť
_es
Profil
Suta
Nemôžeš očakávať, že niekto bude študovať tvoj zložitý kód a skúmať, čo tam máš asi tak zle navrhnuté.
Môže byť viacero dôvodov, prečo to nastáva, napríklad niečo podobné: http://diskuse.jakpsatweb.cz/index.php?action=vthread&forum=8&topic=98175#26.
Alebo keď si vyskúšaš tento príklad, aj keď to sa skôr týka obsadenia pamäte, no keď ho pochopíš, možno nájdeš vo svojom kóde niečo podobné: http://diskuse.jakpsatweb.cz/index.php?action=vthread&forum=8&topic=98351&page=0#24
Alebo nejaká operácia, ktorá sa má vykonať raz, sa namiesto toho vykoná stále viac a viac krát pri rovnakej udalosti myši.
Môžeš mať nejakú udalosť registrovanú viacnásobne...
Suta
Profil
fajzen
Díky! Pomohl jsi "navedením" na vytížení CPU, díky tomu jsem jsem problém odhalil.

_es
Alebo nejaká operácia, ktorá sa má vykonať raz, sa namiesto toho vykoná stále viac a viac krát pri rovnakej udalosti myši
Trefa, díky!

Těžko odhalitelným problémem byl, jak už to tak bývá, jeden jediný příkaz.
S document.onclick a také v menu při událostech onmouseout a onmouseover mám svázanu funkci, v níž jsem měl definováno:
var timer = setInterval ('zavMenu.nulujAktualniKlik();', 20);


Samozřejmě správně mělo být:
var timer = setTimeout ('zavMenu.nulujAktualniKlik();', 20);


Takže jedna z pouček při podobném problému může být: vyhledejte setInterval a ujistěte se, že událost není spouštěna vícenásobně.

Bez vašich tipů bych problém nevyřešil, trápil mě opravdu dlouho... Ještě jednou díky.
_es
Profil
Suta
Pri takýchto veciach záleží na každom detaile a "najvýkonnejšia" verzia setTimeout bude:
var timer = setTimeout(f, 20);
kde f je vopred definovaná funkcia.
Suta
Profil
_es
Jakou mi to přinese výhodu kromě toho, že budu používat kratší (jedno-znakový) název?
Chamurappi
Profil
Reaguji na Sutu:
Kolega _es ti neradí používat krátké názvy funkcí, radí ti nestrkat do setTimeoutů řetězec, protože eval a všechny jeho obdoby (včetně této) jsou zbytečné pomalé fuj.
Suta
Profil
Chamurappi
Můžu poprosit o odkaz na nějakou litaraturu či článek na webu vztahující se k tomu, co píšeš? Tedy „eval a všechny jeho obdoby (včetně této) jsou zbytečné pomalé fuj“.
Zatím jsem se s ničím podobným nesetkal, takže přesně nevím, o čem píšeš. Budu studovat... Díky.
_es
Profil
Suta
Stači v kóde kliknúť na kľúčové slovo v kóde a máš odkaz na dokumentáciu Mozilly, kde máš oba tvary.
Ten spôsob, ako som uviedol ja, spustí už nejak vopred predspracovanú, prípadne aj skompilovanú funkciu.
Ten spôsob, čo používaš ty, musí vždy ten reťazec spracovať, vyrobiť z toho funkciu a až potom tú funkciu spustiť.
A to opakovane pri opakovanom spúšťaní toho príkazu.

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: