Autor Zpráva
Anicka
Profil *
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
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 *
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
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 *
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 *
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
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 :-)

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: