Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno Lze nějak spustit externí Javascript z funkce?

Viz předmět...
Bližsí popis:
mám externí soubor data.js ve kterém jsou definovány hodnoty globálních proměnných - např.: h1="-1.7";h2="-1.5";h3="20.5";
Potřeboval bych v mé funkci "spustit" tento externí soubor, aby se mi hodnoty proměnných změnily. Nemůžu ale najít žádnou funkci javascriptu, která by to uměla.

var h1="0";h2="0";h3="0";
function vypocitej(){
  funkceCoSpustiExterniSoubor('data.js');
  var vysledek=h1+h2+h3;
  alert(vysledek);
}
Předmět Autor Datum
Áno, dá sa to - dynamickým pridaním elementu script: var script = document.createElement("script");…
los 27.12.2006 18:39
los
Vypadá to, že se ten skript neprovedl asi jako v tom mém pokusu... Pokouším se trochu vyspravit jed…
JoDiK 27.12.2006 19:04
JoDiK
Spôsob, čo som napísal, určite funguje vo FF, IE a O. Nie je problém v kešovaní vygenerovaného JavaS…
los 27.12.2006 19:12
los
To nevím, ale když se při reloadu spustí normálně: <script src="data.js" language="JavaScript" type…
JoDiK 27.12.2006 19:19
JoDiK
Skúsil by som dať do toho data.js nejaký alert("nahral som sa"), či sa zavolá aj pri nahraní pomocou…
los 27.12.2006 19:38
los
Asi tam fakt bude problém s tím, že se sice nahraje, ale o něco později a pak je možná v cache a pok…
JoDiK 27.12.2006 22:34
JoDiK
Skript v dynamicky pridanom elemente sa nevykoná hneď (s výnimkou Opery), takže to nastavenie innerH…
los 27.12.2006 23:33
los
Zkusil jsem v té funkci zapsat do prvku na stránce script jako obsah, tím se ale ten externí javascr…
JoDiK 27.12.2006 18:44
JoDiK
A proč to vlastně potřebuješ ? Co přesně řešíš ? To co píše los by mělo opravdu fungovat a já osobně… poslední
Flash_Gordon 28.12.2006 00:01
Flash_Gordon

Áno, dá sa to - dynamickým pridaním elementu script:

var script = document.createElement("script");
script.type = "text/javascript";
script.src = "data.js";
document.getElementsByTagName("head")[0].appendChild(script);

Problém je, že nevieš, kedy sa ukončí nahrávanie externého skriptu. V Opere sa tuším po pridaní elementu počká, kým sa JavaScript nenahrá. V IE to môžeš zistiť pomocou obsluhy udalosti onreadystatechange elementu script a v Mozille cez udalosť onload. Najjednoduchšie je dať na koniec skriptu, ktorý nahráš, volanie funkcie, ktorá Ti oznámi, že nahraný skript končí.

Ďalšia možnosť je použiť objekt XMLHttpRequest, nahrať JavaScript a vykonať ho pomocou funkcie eval. Alebo vytvoriť rámec, do ktorého zapíšeš pomocou document.write element script. Ešte existujú určite aj iné spôsoby.

Zaujímalo by ma ale, prečo to vlastne chceš dynamicky?

Vypadá to, že se ten skript neprovedl asi jako v tom mém pokusu...

Pokouším se trochu vyspravit jeden program co je blbě navrženej.
Tam tu aktualizaci řeší reloadem celé stránky, tak jsem to chtěl upravit tak, že jen načtu nové hodnoty a vyměním obsah odpovídajících prvků. Ale asi neuspěju, tak tam nechám ten reload...

Jde o zobrazení dat do grafu, přičemž data se nachystají .cgi programem na serveru do souboru .js ze kterého se načtou scriptem na stránce a zobrazí.

Skúsil by som dať do toho data.js nejaký alert("nahral som sa"), či sa zavolá aj pri nahraní pomocou skriptu - podľa toho zistíš, či je problém v kešovaní alebo v tom, že sa to ani nenahralo.

Konzola JavaScriptu nehlási nejaké chyby? Sú tie stránky niekde, kde by som sa na ne mohol pozrieť?

Asi tam fakt bude problém s tím, že se sice nahraje, ale o něco později a pak je možná v cache a pokud se neprovede reload stránky, prohlížeč bere starou verzi z cache. Tady jsem udělal testovací stránku test (pracuje se tam ale se dvěma soubory - simulaci vytváření nové verze souboru asi v HTML neudělám). Při první aktivaci se nic neprovede, při dalších už jo.

Nechám to tak jak to je... Díky za pomoc...
původní stránka: historie_den_gr.htm
moje verze: fttgr.htm

Skript v dynamicky pridanom elemente sa nevykoná hneď (s výnimkou Opery), takže to nastavenie innerHTML budeš musieť spraviť trochu neskôr - buď pri obsluhe udalosti onreadystatechange (IE) alebo onload (FF).

Alebo by mohlo stačiť zavolať to nastavenie innerHTML hneď po dokončení vykonávania tej funkcie, ktorá dynamicky pridala skript (neoverené, ale myslím, že by to šlo). Nejako takto:

setTimeout(function() {
  document.getElementById('idata').innerHTML=rok_info+' '+day + "." + month + "."+year;
  document.getElementById('ddata').innerHTML=data;
}, 0);

namiesto tohto, čo tam je teraz:

document.getElementById('idata').innerHTML=rok_info+' '+day + "." + month + "."+year;
document.getElementById('ddata').innerHTML=data;

Zkusil jsem v té funkci zapsat do prvku na stránce script jako obsah, tím se ale ten externí javascript nespustil :-(

var text = '<' + '/script>';
document.getElementById('data').innerHTML='Nova data'+'<script src="data.js" language="JavaScript" type="text/javascript">'+text;

<DIV id="data">Data</DIV>

A proč to vlastně potřebuješ ? Co přesně řešíš ? To co píše los by mělo opravdu fungovat a já osobně bych se tomu snažil
vyhýbat, protože je to mírně komplikované. Popisovaný způsob je dobrý například při tvorbě webového ICQ nebo podobně jinak je vhodné nahrát skript ihned. Opravdu to takto musíš řešit ?
//Edit Aha tak jsem se nedíval na čas už to funguje

Zpět do poradny Odpovědět na původní otázku Nahoru