Autor Zpráva
Georg
Profil
Zdravím, řeším takový problém...mám na stránce umístěn JS, který aktivně upravuje různé pole přes getElementById.
Všechno funguje, script je odladěn pro ruční spuštění (kliknutí na tlačítko) pro MSIE a FF.
Má to však malý problém, a to při automatickém spuštění scriptu pomocí windows.onload při načtení nebo reloadu stránky a to pouze v MSIE. Po spuštění scriptu vyběhne hláška:

Internet Explorer nemůže otevřít server http://...
Operace přerušena


...kliknutím na tlačítko OK se pak stránka reloaduje na hlášku o nedostupnosti serveru

Podivné je, že nejprve celý script proběhne a doplní kam co má a až pak vyplivne tu hlášku.
Pokud automatické spuštění scriptu vypnu a po načtení jej spustím ručně klepnutím na tlačítko, tak proběhne všechno jak má.
Zkoušel jsem i vložit do automatického spuštění nejprve alert, který zastaví průběh a tím umožní dozobrazení celé stránky načtené před tímto krokem, po kliknutí na Ok to však zkolabuje stejně.

- už jsem zjistil že to dělá pouze příkaz getElementById.innerHTML, zatímco value a ostatní parametry proběhnou bez problému.
- getElementById.innerHTML mu vadí jen při zápisu, číst z něho dokáže normálně,
- navíc to není vždy, asi 1 z 10 pokusů projde bez problému.
- aby toho nebylo málo, tak to nedělá na všech PC ... nejspíš různé verze MSIE (mám 7, ale na jiné 7 to klidně šlape)
- dva měsíce to běželo všem bez problémů, začalo to dělat bez zjevné příčiny...to už vůbec nepobírám

Kód scriptu už jsem zkoušel změnit tak, že jsem jej postupně zkracoval až jsem vyeliminoval ten innerHTML jako původce chyby, bohužel nejsem schopen se bez něj obejít (jiná cesta než JS není jelikož se nejedná o mé prostředí, čímž se vylučuje změnit adresování prostřednictvím dosazování do value...nedostanu se do zdroje tak abych si tam přidal objekty)
srigi
Profil
Vsetko ukazuje na to, ze skript spustas v momente, ked este nie je zostaveny DOM, takze fnci getElementById.innerHTML odkazujes na neexistujuce elemeny (este sa nevytvorili z HTML kodu, ktory este nedorazil do browsra). Nasvedcuje tomu vsetko (funguje vytvaranie novych elementov, chyba sa prejavi iba niekedy). Skoda, ze si nepouzil ziadny framework, pretoze tieto maju mechanizmi ako JS vykonat az po zostaveni DOM.
Georg
Profil
Nemám s tím žádnou zkušenost, můžeš přiblížit nějaký způsob jak to lze napsat?
díky moc
srigi
Profil
Neviem ako to riesit v holom JS, ale napr. v jQuery frameworku sa to robi tak, ze vsetok kod sa pise do vnutra istej funkcie, ktora je volana az po zostaveni DOMu:
 $(document).ready(function(){
   // Your code here

});

Takze tak. Osobne si myslim, ze dnes robit cokolvek v JS bez pouzitia JS frameworku je nerozumne, pretoze rozdiely medzi prehliadacmi su tazko laditelne. Framework tieto rozdiely zakryva a lepsie sa tak kodi - vid heslo jQuery: write less, do more.

Ak by si mal zaujem pozri sa na tento fenomenalny serial screencastov od Jeffa Waya (eng).
Chamurappi
Profil
Reaguji na srigiho:
takze fnci getElementById.innerHTML odkazujes na neexistujuce elemeny
Tím to není, to by vyhodilo JS chybu.

Skoda, ze si nepouzil ziadny framework
Tahat desítky kB jen kvůli tomu, že volá funkci ve špatný čas?

pretoze rozdiely medzi prehliadacmi su tazko laditelne
Rozdíly mezi dnešními prohlížeči jsou zanedbatelné v porovnání s minulostí.


Reaguji na Georga:
Chybu způsobuje práce s elementem, jehož HTML kód ještě není dorozebraný. HTML parser teprve chroustá HTML kód a nedovolí skriptu, aby mu do toho kecal.

Stačí zavolat tu funkci, která s tím innerHTML pracuje, na konci HTML kódu. S ohledem na srigim zmíněné heslo jQuery nepotřebuješ jQuery.
Georg
Profil
díky za info
doufal jsem že ten kod by v tu chvíli měl být načtený, struktura je takováto:



obsah html:

<html>
<head>
.....
</head>
<body>
tady je obsah stránky včetně formu s polema, která potřebuji měnit
<script .....tady se linkuje odkay na JS></script>
</body>
</html>



obsah scriptu:

function proved_zmeny1() {
....
}

function proved_zmeny2() {
var hodnota1 =document.getElementById("udaj1").value; ...v pohode
document.getElementById("udaj2").value=hodnota2; ...v pohode

var hodnota3 =document.getElementById("udaj3").innerHTML; ...v pohode
document.getElementById("udaj4").innerHTML=""; ...tohle taky projde
document.getElementById("udaj5").innerHTML=nejaka_hodnota; ... a tohle už ne (teda projde a pokračuje, akorát to na konci vykopne tu hlášku)
....
}

function existId(id) {
....zjišťuje zda form existuje
}

function kontrola_nacteni() {
// alert();
if (existId("tabulka1")) proved_zmeny1();
if (existId("tabulka2")) proved_zmeny2();
}

window.onload = kontrola_nacteni();



Kam tedy dát to spuštění, dál už to nejde? Zkoušel jsem to i samostatně do stránky mimo natahovaného JS i do dalšího natahovaného JS samostatně. Odremování toho alertu taky nepomohlo....doufal jsem, že dá prostor ty parametry do DOMu načíst, bylo to jen pracovně, zůstat by to tam nemohlo.
---- kód je jen ilustrační -----

díky za pomoc
Chamurappi
Profil
Reaguji na Georga:
Kam tedy dát to spuštění, dál už to nejde?
Teď voláš funkci „kontrola_nacteni“ hned a do window.onload přiřazuješ její výsledek.
Musíš do onload přiřadit samu tu funkci, jestli chceš, aby se zavolala až při události. Jinými slovy: zruš ty závorky.
Georg
Profil
sem ale ....
toho jsem si vůbec nevšiml a to jsem ten kód četl asi 100x, tak proto to předtím makalo, ty závorky jsem tam dodělal při dolaďování kódu...aby byl opravdu OK :-)

THX

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

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