Autor | Zpráva | ||
---|---|---|---|
Anicka Profil * |
#1 · Zasláno: 14. 10. 2009, 09:32:55
Mám dlouhatááánský formulář (povinné ručení + havarijní pojištění dohromady v jednom formuláři). V něm jsou mj. selecty pro Výrobní značku vozidla (např. Renault) a typ vozidla (např. Clio). V případě, že uživatel klikne na tlačítko Přepočítat, tak se musí všechny vyplněné údaje znovu nastavit. Zpracování na straně serveru je v LANSE a pro tyto selecty je nutno naplnit js a pak js vybrat příslušné hodnoty podle toho, co mi autor zpracování na serveru nacpe do pomocných hidden polí.
1. Na onload se volá fce formInit. 2. V ní se nejprve načtou značky aut do selectu. Chvilku to trvá - je jich poměrně dost. Až sem to proběhne OK. 3. Pomocí js se vybere určitý option ze selectů. A tohle už neproběhne. 1. pokus o řešení: Když si dám do kódu mezi 2. a 3. testovací alerty: alert(document.getElementById("QVENKZ") == null); // QVENKZ je id toho selectu alert(document.getElementById("QVENKZ").id); tak se zobrazí true QVENKZ Tzn. QVENKZ select je sice null, ale než odklepnu alert (nebo jeho odklepnutím), se nějak inicializuje. 2. pokus o řešení: Když první alert zakomentuji, tak to pochopitelně spadne na tom druhém – jelikož je QVENKZ null, tak to pochopitelně nemůže zjistit jeho id. A samozřejmě pak musí selhat i všechny pokusy o výběr nějakého optionu. 3. pokus o řešení: Když tam dám cyklus čekání než bude QVENKZ různý od null while (document.getElementById(“QVENKZ”) == null) { var a = 1; } tak se nedočkám. Pokus o nastavení timeoutu taky v tomto případě nepomůže, i když jsem s ním pár podobných případů vyřešila. |
||
Chamurappi Profil |
#2 · Zasláno: 14. 10. 2009, 09:41:24 · Upravil/a: Chamurappi
Reaguji na Anicku:
„QVENKZ select je sice null, ale než odklepnu alert (nebo jeho odklepnutím), se nějak inicializuje“ To je podivné. Děje se tak ve všech prohlížečích? Prosím o odkaz na živou ukázku. „2. V ní se nejprve načtou značky aut do selectu. Chvilku to trvá - je jich poměrně dost.“ Přidáváš je jeden po druhém metodami DOMu, nebo vyměňuješ najednou celé innerHTML rodiče <select>u? Druhá metoda bývá rychlejší. |
||
Anicka Profil * |
#3 · Zasláno: 14. 10. 2009, 09:54:21
ad 1) Jestli se to tak chová úplně všude nevím, ale určitě se to tak chová v IE 8 a ve FF 3.5.3, což jsou bohužel bohužel u klienta velmi oblíbené prohlížeče, ve kterých to musí rozhodně fungovat.
ad 2) Odkaz na živou ukázku dát bohužel nemohu - běží to na serveru, kam je přístup pod heslem. Prostě to na mne působí dojmem, že js začne načítat optiony do selectu se značkama, ale nepočká na kompletní ukončení jejich načítání a snaží se pracovat dál. |
||
Chamurappi Profil |
#4 · Zasláno: 14. 10. 2009, 11:06:44
Reaguji na Anicku:
„určitě se to tak chová v IE 8 a ve FF 3.5.3“ To vypadá spíš na principiální závadu ve skriptu než na anomálii v prohlížečích. „Odkaz na živou ukázku dát bohužel nemohu - běží to na serveru, kam je přístup pod heslem.“ Nemůžeš někde připravit osekanou kopii ukazující problém, ale bez citlivých údajů? „nepočká na kompletní ukončení jejich načítání a snaží se pracovat dál“ Toho by šlo dosáhnout jen pomocí nějakého timeoutu či jiné události. Tedy, že serverem nadiktované formulářové prvky se negenerují hned, ale až někdy … později. Aha. Asi už vím. Není to náhodou tak, že tvůj zmiňovaný skript nečeká na načtení dat ze serveru? XMLHttpRequest (aka AJAX), který vysílá požadavek na server, by měl mít nastavenou callback funkci, která se volá po stažení odpovědi. Tahle callback funkce asi v tvém případě vytváří všechny ty věci, se kterými potřebuješ pracovat. Teprve poté, co se vytvoří, s nimi můžeš pracovat, tzn. měla bys to své document.getElementById volat až z callback funkce, nikoliv hned po vyslání požadavku. Jestli jsem se netrefil, bude opravdu nutná ukázka. |
||
Anicka Profil * |
#5 · Zasláno: 14. 10. 2009, 12:24:40
Jsi šikula.
Timeout nepomůže, ten jsem samozřejmě zkoušela (viz bod č. 3 úvodního popisu problému). Obvykle mi v minulosti v podobných případech pomohl, ale zde ne. Asi to bude tak jak píšeš na konci. Je tam skutečně Ajax, který načítá ty značky a modely do selectů. Pokud s tím pracuju při vyplňování formuláře - není problém - fce callback je definovaná a zřejmě funguje dobře. Problém je, když uživatel klikne na Přepočítat. Pak se to shodí na server, při načítání pro zpětné nastavení vybraných hodnot na onload ručně vynutím volání stejné fce jako je na onchange selectu, která to shodí AJAXu. AJAX si zřejmě cosi přežvykuje, ale skript na incializaci formuláře vesele jede dál. Jenže jak mám donutit inicializační skript formuláře, aby počkal na AJAX? |
||
Anicka Profil * |
#6 · Zasláno: 14. 10. 2009, 13:01:51
HURÁÁÁÁÁ!!! VYŘEŠENO
Do formuláře jsem si dala hidden pole, do kterého jsem si vložila hodnotu 1. Do callbacku AJAXU jsem si dala test, zda je v tom poli 1. Pokud ano, tak spusť ten konec, co byl v onload formuláři zatím a nastav hodnotu v hidden poli na 0. A onload formuláře končí voláním AJAXu. |
||
Chamurappi Profil |
#7 · Zasláno: 14. 10. 2009, 13:06:43 · Upravil/a: Chamurappi
Reaguji na Anicku:
„Timeout nepomůže, ten jsem samozřejmě zkoušela“ Nemyslel jsem timeout jako řešení, ale timeout jako potenciální příčinu. Příčinou bude ten AJAX. „Jenže jak mám donutit inicializační skript formuláře, aby počkal na AJAX?“ Přesuň spuštění této inicializace do callback funkce. Edit: Pozdě. „VYŘEŠENO“ Tak gratuluji :-) |
||
Časová prodleva: 15 let
|
0