
JavaScript
Zdravím.
Proč je u toho vždý funkční až ten posledni div?
Muže je mezi sebou popřehazovát, ale vžda jen ten poslední.
<!DOCTYPE html>
<html>
<body>
<div id="shm/teplota_obyvak"" class="data">Žádná data :(</div>
<div id="shm/teplota_koupelna" class="data">Žádná data :(</div>
<div id="shm/teplota_loznice" class="data">Žádná data :(</div>
<div id="shm/teplota_pokoj" class="data">Žádná data :(</div>
<script>
function nactiData() {
var data = document.getElementsByClassName("data");
for (var i = 0; i < data.length; i++) {
var soubor = data[i].getAttribute("id")
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
document.getElementById(soubor).innerHTML =
this.responseText;
}
};
xhttp.open("GET", soubor, true);
xhttp.send();
}
}
nactiData();
setInterval(function () {
nactiData();
}, 10000);
</script>
</body>
</html>
https://stackoverflow.com/questions/13077828/for-loop-in-javascript-outputs-value-only-from-last-iteration
https://dzone.com/articles/why-does-javascript-loop-only-use-last-value
Jsem to asi špatně pochopil
Už to nefunguje vubec
S toho jsem nějak mimi.
V linuxu se alespon trochu orientují ale JS vidím dnes poprve.
Potřebují to pro manželku, aby v telefonu viděla teploty.
Však Vám to Wikan celé napsal, len to vložte do cyklu for() v setTimeout()... tam jak ste mali funkci "nactiData()" data pak pouzijete za tym. Aj bych Vám to napsal, kdybych nebyl na mobilu vo vlaku. Ostatne nechápem ani to prečo si nepomozete knihovnou nebo frameworkom.
dufam som to na mobile napsal a nakopíroval spravne a neusli mi zatvorky...
kdyz napíšete var hocikde i na trebars na konci funkcie, tak sa vždy interpetuje jak kdyby byl deklarovany na začiatku funkcie, je viazany na scope funkcie. Môžete použiť let ktory je viazaný na scope bloku, teda i samotneho cyklu. Ak volate funkciu vo vnutry cyklu, a vo volanej funkcii chcete použiť premennú iteracie, musite ho predať ako parameter. Logickejsie je ale to prepsat tak, aby ste mali iterator v bloku kde ho pouzivate, ako napríklad vo Vašom prípade pre výber prvku z arrayu. Ja bych tu funkci oddelil inak, tak jak to napsal Wikan.
Odporúčam Vám si nájsť neco o uzaveroch, closures. Ak to pochopíte, už takéto chyby budete vedieť vyriešiť.
Vysledek uplně stajný jako v tom mém.
Žádná data :(
Žádná data :(
Žádná data :(
23.2|56.0
Co přesně tam máš za kód? Určitě jsi načetl aktuální verzi stránky a ne z cache?
Smaž tu samotnou složenou závorku, je tam navíc.
Pokud jsem to neposmolil tak furt to same.
Nudím se v prací tak hledam a zkoušim to co je na w3schools.com
Toto mi take funguje.
Není pak lepší přejmenovat ty div - "div1", "div2"
A už sis teda zkontroloval, že se ti to nenačítá z cache?
A to zjistím jak?
Ony se načitají všechní 4 teploty ale vpisují se postupně do toho posledního DIV
Stiskni v prohlížeči Ctrl + F5.
tak som to fakt zle skopíroval... ja tak nenávidím psaní na mobilu...
Ne ne, už jsem ji tam měl blbě já.
Ak zmeníš v pôvodnom programe riadok "var" na "let" v riadku "var soubor = data[i].getAttribute('id')", tak to začne fungovať.
Dôvod bol už napísaný - je to kvôli tomu, že premenné deklarované pomocou var sú naviazané na funkciu. To znamená, že premenná soubor použitá v obsluhe udalosti onreadystatechange je stále jedna a tá istá premenná pre všetky iterácie cyklu. Takže každá iterácia nastaví hodnotu premennej soubor na identifikátor požadovaného elementu a po skončení cyklu táto premenná obsahuje posledný identifikátor a obsluha udalosti sa vykonáva až po ukončení cyklu.
Osobne by som to napísal takto (XMLHttpRequest by som použil iba ak by som musel podporovať nejaký zastaralý prehliadač, ako napr. IE11 - resp. skôr by som použil polyfill a transpiler):
pravda ja debil, sám som napsal že to treba zmeniť za let, ale když som mu psal kód tak som tam dal var....
Děkují moc
Ještě kdyby jsi tak napsal, co jsi nakonec udělal.
ctrl+c a ctrl+v to poslední, co tu dál moose
Mužů ještě jednu prosbu.
Jak třeba tu hodnotu ze souboru shm/teplota_obyvak stáhnu v JS do proměnné, abych s ní v JS mohl dál pracovat?
Máš ji přece v this.responseText. S ní si pak můžeš dělat, co chceš.
Aha, už to chapu
Zatím jen pokusy ale pro mně bude lepší něco takoveho.
Akorat volat tu funkcí s parametrem nactidata("shm/teplota_kotel");
A pak zpracovat a vypsat až ve funkci setInterval
Bych měl ještě jeden dotaz.
Jak umístit na stránku obrázek tak, aby šel přes JS měnit.
Třeba takto.
0 = jeden obrazek
1 = jiný obrazek
možno je vhodnejšie do HTML napsať:
do CSS:
a v JS by ste prepínali triedy.
(ukážka v jQuery)
Můžete vysvětlit, jak funguje toto?( xhttp. {}; )
A chybí tam středník (pokud není nepovinný v dané implementaci, ale v Internet exploreru by to neprošlo)
Problém bude nejspíš v this, je někdy záludné a v určitých případech je nutné si uložit pomocnou proměnnou novethis=this a potom pracovat uvnitř funkce s novethis.
Obecně je to problematika closures, což jsou je věc týkající se toho, zda uvnitř funkce jsou dostupné proměnné z vnější (a jakým způsobem). Funkce ve své podstatě by měly operovat pouze proměnnými, které dostanou v argumentech. Ale tak to není a proto i funkce operují s proměnnými dostupnými z nadřazeného scope (zjednodušeně globální proměnné)
doporučení: není nutné dávat všem prvkům class=data, stačí je dát do nadřazeného bloku:
Kde jsi viděl takovou konstrukcí? To snad ani nemůže fungovat.
Následující řádek za new XMLHttpRequest();
Na tom řádku je toho ale poněkud více.
Aha, asi nějaká chyba parsování... Prostě mi to zamlčelo ve všech příspěvcích to, že toho je poněkud více na tom řádku... od tečka onr...change=fu(...