Autor Zpráva
Ricky4852
Profil
Dobrý deň,

začal som používať JQuery, ale narazil som na menší problém, pri používaní funkcie $("#div").load('url'), totiž používam ho pri načítaní správv "chate". Funkcia s týmto skriptom sa mi opakuje cez setTimeout(), každých 200 milisekund, a obsah zo stránky url sa mi načíta do divu. Problém je v tom, že ak som si cez správcu úloh pozrel Pamäť využívajúcu prehliadač, stúpla behom minúty z 60 000 na 400 000, a stále sa zvyšovala. V Google Chrome mi to po chvíli vyplo stránku...

        function loadChat() {
        $("#div").load('chat.php', function(resp) {});
        setTimeout("loadChat()",200);
        }
Toto je ten skript, skúšal som triky na vymazanie pamäti, napríklad
delete resp;
$('#div').empty();

ale nič z toho nepomohlo, pamäť sa naďalej zmenšovala, dúfam že mi s tým bude niekto vedieť pomôcť, ďakujem...
joe
Profil
1. Zkoušel jsi používat AJAX bez jQuery a jak se to projevovalo?
2. K čemu je dobré načítat nové zprávy 5x za vteřinu?
3. V metodě jako je setTimeout se nepoužívá string, ale odkaz na referenci, tedy jen setTimeout(loadChat, 200);
4. Jseš si jistý, že kód dělá to, co popisuješ a chceš? Pokud chceš volání akce opakovat, pak je pro tebe lepší setInterval
Ricky4852
Profil
1. Skúšal som, išlo to v pohode a pamäť sa nezväčšovala, lebo sa stále nahrádzala novou, avšak potrebujem použiť JQuery, pretože je rýchlejší a dovoľuje spúšťať načítané skripty
2. Chcem aby bol ten chat dynamický, a aby človek vedel čo napísal, inak by sa mu správy objavovali dosť pomaly a nevedel by či správu poslal alebo nie
3. Je to možné, funguje to aj mojim spôsobom, skúsim či to pôjde aj tak ako píšeš
4. Kód je správny a robí to čo chcem, skúsim aj ten setInterval, neviem či to však vyrieši môj problém čo som spomínal na začiatku


Tak som skúsil ten setInterval, výsledok je rovnaký ako s použitím setTimeout
joe
Profil
Ricky4852:
Ukážeš nám i ten kód, který předtím fungoval?
shaggy
Profil
Ricky4852:
JQuery, pretože je rýchlejší a dovoľuje spúšťať načítané skripty
Ty vôbec rozumieš tomu, čo píšeš? Ja nie som javascript nazi ako napríklad Chamurappi a nemám nič proti JS frameworkom, ale už len z princípu nemôže byť akýkoľvek framework postavený na nejakom jazyku rýchlejší ako vstavané funkcie jazyka. jQuery je "pohodlné", rieši za teba dosť vecí, ale nemýľ si to s rýchlosťou.

Chcem aby bol ten chat dynamický
Tak to by si mal načítať ten obsah 25x za sekundu, aby sa menil s každým mojim žmurknutím.
Keeehi
Profil
Ricky4852:
1) „Skúšal som, išlo to v pohode a pamäť sa nezväčšovala
No vidíš, problém vyřešen.

2) Nemusíš to načítat 5x za vteřinu. Jsou i jiné metody jak mít obsah aktuální, avšak pokud se nic neděje, posílat na server požadavek jen třeba jednou za 30 sekund. Hledej "long pooling".

3) Ano, funguje to, ale ...
Ricky4852
Profil
No, problém stále nie je vyriešený, robil som to pôvodne cez skripty ako
window.XMLHttpRequest, xmlhttp.open, xmlhttp.send atd...
ale stránka ktorú som sa pokúšal načítať mala zároveň spúšťať aj skripty, ( <script>alert('blabla');</script> ), čo už však nešlo, preto mi kamarát odporúčil JQuery, ktorý mi zázračne načítal obsah zo stránky do divu a spustil aj ten skript.
Takže som prešiel na JQuery, ale v poriadku, aj keby som stránku načítaval raz za 10 sekúnd, tak by sa mi pamäť zahltila tak či tak, netrvalo by to 30 sekúnd ale možno 5 minút... Tomu sa však chcem vyvarovať, predsa niekde sa musia "tie" dáta ukladať do pamäte, len neviem ktoré to sú a ako ich vyčistiť... :(
joe
Profil
Ricky4852:
robil som to pôvodne cez skripty ako
window.XMLHttpRequest, xmlhttp.open, xmlhttp.send

A myslíš, že jQuery to uvnitř řeší jinak?

Jak napsal Keeehi, jde to i jiným způsobem. Co kontrolovat nové zprávy cca. jednou za 15 vteřin + po odeslání zprávy? To by ti mělo bohatě stačit.

Ten tvůj kód by měl být spíš

function loadChat() {
  $("#div").load('chat.php', function(resp) {});
}
setInterval(loadChat, 1000);

stránka ktorú som sa pokúšal načítať mala zároveň spúšťať aj skripty
K čemu to je dobré?
Chamurappi
Profil
Reaguji na Rickyho4852:
stránka ktorú som sa pokúšal načítať mala zároveň spúšťať aj skripty, ( <script>alert('blabla');</script> ), čo už však nešlo
Proč potřebuješ, aby se spouštěl dotahovaný skript? Je v něm něco, co nemůže být v mateřské stránce?

ktorý mi zázračne načítal obsah zo stránky do divu a spustil aj ten skript
Za zázraky se platí. Za ty ohavné se někdy platí únikem paměti. Je jen jedna možnost, jak <script> přiřazovaný do innerHTML spustit.

keby som stránku načítaval raz za 10 sekúnd, tak by sa mi pamäť zahltila tak či tak, netrvalo by to 30 sekúnd ale možno 5 minút
Pětsetkrát vyšší interval pětsetkrát protáhne dobu zahlcení, takže by to trvalo přes 4 hodiny.

2. Chcem aby bol ten chat dynamický
Člověk si ale stejně nestihne přečíst pět nových zpráv za sekundu.

aby človek vedel čo napísal, inak by sa mu správy objavovali dosť pomaly a nevedel by či správu poslal alebo nie
Proč by to nevěděl? To při odeslání zprávy nestahuješ zároveň aktuální stav? Celé mi to připadá nějaké divně vymyšlené.
Ricky4852
Profil
„A myslíš, že jQuery to uvnitř řeší jinak?“
No asi áno, keď mi to skripty spúšťa, pôvodne mi ich všetky ignorovalo, lebo načítalo len jeho html obsah, toto zrejme načíta stránku ako celok...

„K čemu to je dobré?“
Jednoducho s nimi potrebujem pracovať, aby chat fungoval, celý funguje len na základe ajaxu.

Ten kód ktorý si mi poslal funguje tiež, ale nevyrieši to stále môj problém.

Skúsil som funkciu $("div").remove();, div mi to však vymazalo, ale pamäť sa naďalej už nezmenšovala, možno by to šlo týmto spôsobom, potom by som ho ale potreboval znovu vytvoriť
Amunak
Profil
Ricky4852:
Můžeš taky každou sekundu posílat jen dotaz, jestli je v chatu něco nového, a až když je, načíst to. Není třeba vždy vytahovat celý obsah chatu. Určitě to ocení i lidé s pomalejším připojením, kterým stejně zahltíš linku, pokud budeš každých dvěstě milisekund stahovat pár tisíc bajtů.
Nox
Profil
shaggy:
Ty vôbec rozumieš tomu, čo píšeš? Ja nie som javascript nazi ako napríklad Chamurappi a nemám nič proti JS frameworkom, ale už len z princípu nemôže byť akýkoľvek framework postavený na nejakom jazyku rýchlejší ako vstavané funkcie jazyka. jQuery je "pohodlné", rieši za teba dosť vecí, ale nemýľ si to s rýchlosťou.

V přesném slova smyslu ne, ale v určitém praktickém úhlu pohledu to být možné může a to tak, když framework obsahuje mnoho optimalizací doplněné mnoha lidmi ... kde jeden člověk většinou všechny nezná a k tomu nemá třeba čas všechny v projektu aplikovat ... a vzhledem k tomu že určitý úkon může být často realizován v jazyku mnoha způsoby, může být ve frameworku třeba ta sice složitější (nebo méně čitelná), ale rychlejší

Ricky4852:
Nevim co přesně tam skriptuješ, každopádně je rozhodně možné to udělat bez toho a to i kdyby ten skript byl generovaný přes PHP. Možná využiješ jQuery metodu .live(), pokud je to generované, tak místo toho můžeš použít třeba data-* atributy. Ale líp se bude odpovídat když budem vědět, o co jde
Chamurappi
Profil
Reaguji na Rickyho4852:
Jednoducho s nimi potrebujem pracovať, aby chat fungoval
Nepotřebuješ.

ale pamäť sa naďalej už nezmenšovala
Garbage collector uklízí, až když si myslí, že je vhodné uklízet. I kdyby se ti povedlo uvolnit paměť, nemusí se to projevit.


Reaguji na Noxe:
když framework obsahuje mnoho optimalizací
Zrovna na AJAXu ale není co optimalizovat.

tak místo toho můžeš použít třeba data-* atributy
Není důvod prohánět informaci přes DOM.
Nox
Profil
Možná, nevim co chce těma skriptama dělat ... no nebo to celé poslat jako JSON, bez markupů, jen data
_es
Profil
Ricky4852:
Dôvody ti boli vysvetlené, sprav to nejako normálne, aby neboli vo vrátených dátach elementy <script> - na uvedený účel nie sú treba.
Ricky4852
Profil
OK, ďakujem všetkým za pomoc
Witiko
Profil
shaggy:
Chamurappi ... javascript nazi
Tady je teď koukám ještě větší zábava, než když jsem tu byl stálým hostem. :-)

Ricky4852:
Data předávej pomocí JSON a na HTML si je přetvářej až javascriptem samotným. Jinak místo tupého updatu každých 5 sekund můžeš zkusit nějakou formu tzv. HTTP pushe, kdy dostaneš nové zprávy jakmile na serveru jsou bez nutnosti neustálých update. Ale je to jak implementačně náročnější, tak vyžadující nízkoúrovňovější přístup k serveru, než nabízí většina free hostingů.

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: