Autor | Zpráva | ||
---|---|---|---|
vkalina Profil |
#1 · Zasláno: 12. 4. 2013, 19:00:34 · Upravil/a: Moderátor (editace znemožněna) 13. 4. 2013, 22:27:51
pomůže mi někdo s tímto ?
<script> var pom; var x = (window.ActiveXObject) ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest(); x.open("GET", "get_sys[309]?rn=3&rand="+Math.random(), true); x.onreadystatechange = function(){ if(x.readyState==4 && x.status==200){ var rE=x.responseText.split("|"); var cidlo=''; for (i=1;i<=2;i++) { cidlo='teplota'+i; var pom=rE[i]/100; alert(cidlo); //jenom kontrola if (pom>200) { cidlo(cidlo); } else { pom=pom.toFixed(1); alert(pom+"°C"); //jenom kontrola } } } } x.send(null); </script> Tento script mi vytváří jména proměnných a vyčíta teploty ze zařízení , ale potřebuji je dostat do lokálních proměnných, které budou teplota1, teplota2 .........teplota9. Zatím tam mám jenom 2 čidla, takže jsem cyklus omezil na 2, ale vůbec netuším jak to udělat, abych z toho dostal lokální proměnné, s nimiž potřebuji dál pracovat. tady je odkaz na funkční script 62.209.235.85/user.htm Děkuji za pomoc |
||
ShiraNai7 Profil |
#2 · Zasláno: 12. 4. 2013, 19:25:26
Použij pole nebo objekt.
|
||
vkalina Profil |
#3 · Zasláno: 12. 4. 2013, 23:40:35
ShiraNai7:
Pole mi funguje, ale mam k tomu dva dotazy, 1/ u první a poslední položky pole se mi zobrazí uvozovky - daj se z toho odstranit ? 2/ a to je pro mě to nejhorší, jakmile to vyskočí z funkce, tak se pole ztratí a tudíž ho nedostanu do proměnný Dik <script> var x = (window.ActiveXObject) ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest(); x.open("GET", "get_sys[309]?rn=4&rand="+Math.random(), true); x.onreadystatechange = function(){ if(x.readyState==4 && x.status==200){ var rE='"'+x.responseText.split("|")+'"'; var pole=rE.split(","); document.write(pole[0]); //tady se pred zobrazi " document.write(pole[1]); document.write(pole[2]); document.write(pole[3]); //tady se pred zobrazi " } } x.send(null); document.write(pole[1]); //tady uz pole neexistuje document.write(pole[2]); //tady uz pole neexistuje </script> |
||
juriad Profil |
#4 · Zasláno: 12. 4. 2013, 23:49:14
k uvozovkám: na řádku 6 si ty uvozovky přidáváš, tedy tam jsou
k poli mimo onreadystatechange : uvědom si, že dotaz na server se nevrátí hned (ona také odpověď nikdy nemusí přijít, nebo může přijiť s chybou, například 404 Not Found), vždy si u AJAXu představ pomalé spojení, kdy odpověď přijde až po minutě. Ale řádky 15 a 16 se provedou okamžitě po odeslání požadavku (nikoji po přijetí odpovědi), tedy je nesmyslné uvažovat nad tím, že data v poli by mohla být dostupná (i když pominu že pole je lokální proměnná a mimo svůj kontext neexistuje).
|
||
vkalina Profil |
#5 · Zasláno: 13. 4. 2013, 00:22:39
juriad:
No ted jsem se to taky dočet, ale jak z toho ven ? 1, kdyz tam ty uvozovky nedam, tak se mi pole nacte jako jeden celek a nejdou mi z nej pak tahat jednotlivy udaje mezi carkou. (to ale dokazu osetrit) 2, kdyby to slo nacitat tak, aby to nebyla funkce, byl bych spokojenej, ale nevim jestli je to vubec mozny. - A jak se da vubec promena z funkce vytahnout ? |
||
vkalina Profil |
#6 · Zasláno: 13. 4. 2013, 02:15:07
Tak jsem to nakonec spachal takto, pokud tam nekdo uvidite neco co nesedi, prosim o upozorneni, nez to zakomponuju do webu
Diky <script> function teplota(){ var x = (window.ActiveXObject) ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest(); x.open("GET", "get_sys[310]?rn=9&rand="+Math.random(), true); x.onreadystatechange = function(){ if(x.readyState==4 && x.status==200){ var rE='"zacatek,'+x.responseText.split("|")+',konec"'; var pole=rE.split(","); var venku=pole[1]/100; venku=venku.toFixed(1); var doma=pole[2]/100; doma=doma.toFixed(1); var kotel=pole[3]/100; kotel=kotel.toFixed(1); var boiler=pole[4]/100; boiler=boiler.toFixed(1); var radiator=pole[5]/100; radiator=radiator.toFixed(1); var aku1=pole[6]/100; aku1=aku1.toFixed(1); var aku2=pole[7]/100; aku3=aku2.toFixed(1); var aku3=pole[8]/100; aku3=aku3.toFixed(1); var aku4=pole[9]/100; aku4=aku4.toFixed(1); alert(venku+"°C "+doma+"°C "+kotel+"°C "+boiler+"°C "+radiator+"°C "+aku1+"°C "+aku2+"°C "+aku3+"°C "+aku4+"°C "); } } x.send(null); } teplota(); </script> |
||
weroro Profil |
Ahoj, skús to takto:
function teplota () { var ajax = (window.ActiveXObject) ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest(); ajax.open("GET", "get_sys[310]?rn=9&rand=" + Math.random(), true); ajax.onreadystatechange = function () { var pole, vystup; var kde = new Array (); if(ajax.readyState == 4 && ajax.status == 200) { pole = ajax.responseText.split("|"); for (var i = 0; i < pole.length; i++) { kde.push((pole[i]/100).toFixed(1)); } vystup = kde.join('°C '); alert(vystup); } } ajax.send(null); } teplota(); |
||
vkalina Profil |
#8 · Zasláno: 13. 4. 2013, 02:38:34
Ty jo, diky. Mě ale nejde o ten alert(), ten tam nebude. Já to potřebuju kvůli těm proměnným, abych podle nich mohl sestavovat obrázek viz.
http://62.209.235.84/user.htm |
||
weroro Profil |
Ty tam ale tie premenné vkladáš pri vytváraní dokumentu a už sa nedajú dodatočne meniť (v tvojom prípade). Musíš si dorobiť funkciu, ktorá bude prepisovať tie zobrazované hodnoty.
Napr. tam vidím toto: <script>document.write('<td rowspan="2" colspan="6" width="136" height="84" valign=bottom align="center"><b><input type="button" onClick="nastavteplotudoma()" value="Změna teploty">Vnitřní teplota<br> ' + doma + '°C</td>')</script> ale to sa zapíše pri vytvorení stránky a potom to už meniť nejde.
Možno to pôjde aj jednoduchšie ale všetky tieto scripty by som dodatočne upravil takto: <script>document.write('<td rowspan="2" colspan="6" width="136" height="84" valign=bottom align="center"><b><input type="button" onClick="nastavteplotudoma()" value="Změna teploty">Vnitřní teplota<br><span id="doma"></span>°C</td>')</script> a podobne aj ostatné.
<span id="venku"></span> <span id="kotel"></span> <span id="radiator"></span> Potom by bolo jednoduché zamerať konkrétnu položku a prepísať ju novou hodnotou. (chamurapimu príde z toho "riešenia" nevoľno) var idcka = new Array('venku', 'doma', 'kotel', 'boiler', 'radiator', 'akum1', 'akum2', 'akum3', 'akum4'); var hodnoty = new Array(15, 22, 95, 60, 50, 90, 60, 39, 27); // v poli sú položky usporiadané rovnako ako v tom tvojom alerte ale začínajú od 0 a nie od 1 // položky v poli "idcka" musia byt v rovnakom poradí ako im pridelené hodnoty v poli "hodnoty" function teplota () { var ajax = (window.ActiveXObject) ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest(); ajax.open("GET", "get_sys[310]?rn=9&rand=" + Math.random(), true); ajax.onreadystatechange = function () { var pole, vystup; if(ajax.readyState == 4 && ajax.status == 200) { pole = ajax.responseText.split("|"); for (var i = 0; i < hodnoty.length; i++) { hodnoty[i] = (pole[i]/100).toFixed(1); } spustenie (); } } ajax.send(null); } function spustenie () { for (var i in idcka) { document.getElementById(idcka[i]).innerHTML = hodnoty[i]; } } teplota(); a na úplný koniec stránky pred body si daj toto: <script type="text/javascript"> spustenie (); </script> |
||
vkalina Profil |
#10 · Zasláno: 13. 4. 2013, 09:07:02
Ty prommenne jsou tam ted jenom aby se mi to zobrazovalo, ve finalnim scriptu nebudou, tam se prave uz budou natahovat aktualni hodnoty z cidel. Nejdriv jsem prave psal grafiku, a ted jsem vymejslel jak tam dosadim aktualni hodnoty. Nejvic me pave trapi ta funkce //x.onreadystatechange = function()// ta kdyby tam nebyla tak to bylo v pohode. Mám tedy v umyslu celý script http://62.209.235.85/user.htm zapouzdrit do funkce //teplota()// a tu pak dat jako <body onLoad="teplota();">. Co se tyce funkci //nastavteplotudoma() a nastavteplotusystemu() // tyto pouze při kliknutí změní hodnoty v registrech zařízení na kterém pak poběží vlastní PLC program jež se stará o regulaci vytápění. V soušasnosti to celé provozuji pod php na serveru http://ksystems.cz/Teplomer/kotelna.php ted ale netopim tak pro názornější ukázku koukněte sem http://ksystems.cz/Teplomer/tcklima.php topim tedka pres klimatizace. Vzhledem k tomu ze prave desky co mi odecitaj teploty uměj i vytvoreni uzivatelske stranky (bohuzel jenom jeden htm soubor) a regulaci pres PLC . Chci cely system prevest na ně abych to mohl provozovat i bez serveru. Pred rokem jsem se kvuli tomu ucil Linux a PHP no a ted kvuli tomu objevuji Javascript a PLC. Bohužel ve svém okolí nemám nikoho od koho bych čerpal a tak jsem rád za lidi jako vy co maj trpělivost mi Javascript objasnit
|
||
1Pupik1989 Profil |
#11 · Zasláno: 13. 4. 2013, 09:29:03
Celkově asi moc lidem by se nelíbila ta funkce
spustenie . Iterace na pole se píše trochu jinak.
var length = pole.length; for (var i=0;i<length;i++) { //nějaký kód } Ta pole icka a hodnoty bych asi sloučil. Čili pak by byly ve tvaru:
var teploty = [ {nazev:"venku",hodnota:15}, {nazev:"doma",hodnota:22}, {nazev:"kotel",hodnota:95}, {nazev:"boiler",hodnota:60}, {nazev:"radiator",hodnota:50}, {nazev:"akum1",hodnota:90}, {nazev:"akum2",hodnota:60}, {nazev:"akum3",hodnota:39}, {nazev:"akum4",hodnota:27} ]; a funkci upravil na: function spustenie(){ var teplota,length = teploty.length; for(var i=0;i<length;i++){ teplota = teploty[i]; document.getElementById(teplota.nazev).innerHTML = teplota.hodnota; } } Za případné chyby mě omluvte, spal jsem 3 hodiny. |
||
vkalina Profil |
#12 · Zasláno: 13. 4. 2013, 09:34:12
No to ja taky, ale jak jsem psal, teploty se budou stahovat funkci teplota (), takze nastavovani statickych hodnot pro me nema vyznam
|
||
1Pupik1989 Profil |
Nejjednodušší by bylo, kdyby dotazovaná stránka vracela JSON objekt, pak by nebylo potřeba nic řešit. Hodnoty v tom poli se dají změnit úplně stejně jako v tom cyklu.
for (var i = 0; i < teploty.length; i++) { teploty[i].hodnota = (pole[i]/100).toFixed(1); } |
||
vkalina Profil |
#14 · Zasláno: 13. 4. 2013, 09:53:03
No to na mě bohužel mluvíte maďarsky, pokusím se to slejt dohromady a pak vám to tu vystavím ke korekci. Prosím o trpělivost, nejsem programátor spíš takovej lepič kódu
|
||
vkalina Profil |
No a je to to tady, co mám blbě prosím
http://62.209.235.84/user.htm vypadat by to melo takto http://ksystems.cz/Teplomer/vyvoj.htm |
||
weroro Profil |
vkalina:
Script asi spadne, lebo sa snažíš použiť neznáme premenné. (napr. premennú doma ).
Máš nejaký špeciálny dôvod, prečo máš všetky obrázky v stránke pomocou base64 ? Ono sa to strašne zle číta, keď je tam kopa vecí, ktoré by tam byť nemali, ako napr. tie obrázky. Vkladaj ich pomocou CSS. 1Pupik1989: „Iterace na pole se píše trochu jinak.“ Čo je zlé na použití for in , keď viem ako funguje a má jednoduchší zápis, pričom sa na danú situáciu hodí? Rozdiel medzi tvojim cyklom a mojim, je ten, že ty musíš testovať dĺžku poľa, a zapisovať zložitejšiu podmienku. Môj cyklus proste prejde všetky položky poľa - síce od konca ale to nevadí.
|
||
vkalina Profil |
Bohuzel, mam. To zarizeni na kterem to bezi, umoznuje ulozit pouze jeden html soubor a to jeste o maximalni velikosti 160kB. Proto to base64. Jinak bych musel nacitat obrazky od nekud jinud a to nejde, protoze chci, aby to bylo funkcni i bez internetu
No a s tema promennyma to je ten problem, co porad nemuzu nejak rozlousknout. Neumim to napsat tak, aby se promenny nevycitaly z funkce. Pokud bych vyresil toto, tak to bude v pohode. Doufal jsem ze to obejdu prez ten <body onLoad="teplota();"> , ale jak je videt, tudy cesta nejspis taky nevede Jenom se jeste pokusim vysvetlit princip = V tabulce jsou umisteny narezane obrazky, to co je pripo v tabulce je staticke a nemenise, to co je ve funkci teploty() to se prirazuje podle toho jaké teploty si zrovna script stahne. Nespis by to slo asi vyresit pres DOM , ale nemam ani paru o tom jak to napsat |
||
vkalina Profil |
#18 · Zasláno: 13. 4. 2013, 16:12:05
Jeste me napadla jedna prasarna, pokud bych pred koncem funkce zavolal //return// zůstanou mi načtené proměnné z funkce ?
|
||
1Pupik1989 Profil |
#19 · Zasláno: 13. 4. 2013, 16:15:06
weroro:
Pokud nechápeš proč pro tento případ není dobrý for in , pak doporučuji pročíst developer.mozilla.org. Na pole s číselnými indexy je to špatné řešení. Nemluvě o rychlosti. Takže rozdíl mezi mým a tvým zápisem je ten, že já používám cyklus na procházení pole s číselnými indexy, kdežto ty používáš cyklus na asociativní pole nebo objekt.
|
||
vkalina Profil |
uz to skoro mam, jenom nevim jak to napsat
var x = (window.ActiveXObject) ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest(); x.open("GET", "get_sys[310]?rn=9&rand="+Math.random(), true); x.onreadystatechange = function(){ if(x.readyState==4 && x.status==200){ var rE='"zacatek,'+x.responseText.split("|")+',konec"'; return rE; } } var pole=rE.split(","); var venku=pole[1]/100; venku=venku.toFixed(1); if (venku > 200){ venku = 15; } var doma=pole[2]/100; doma=doma.toFixed(1); if (doma > 200){ //docacna funkce, nez pripojim cidla doma = 22; atd....... |
||
Chamurappi Profil |
#21 · Zasláno: 13. 4. 2013, 17:49:33
Reaguji na vkalinu:
Nijak, ta funkce v onreadystatechange se odehrává jindy, než zbytek skriptu. Data stažená XMLHttpRequest em musíš zpracovat v této funkci. Nemůžeš použít document.write . Nejde to. Opravdu. Smiř se s tím a pak si přečti znovu, co ti psali ostatní.
|
||
1Pupik1989 Profil |
No já používám na načítání souborů funkci bez
onreadystatechange události.
function loadFile(src){ var xmlhttp; if (window.XMLHttpRequest){ xmlhttp=new XMLHttpRequest(); }else{ xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); } xmlhttp.open("GET",src,false); xmlhttp.send(); return xmlhttp.responseText; }; Nicméně jsem ještě netestoval jak to dopadne v ostatních prohlížečích. V Chromu jde. Pro mě bylo důležité nepoužívat callback. |
||
vkalina Profil |
#23 · Zasláno: 13. 4. 2013, 18:00:02 · Upravil/a: vkalina
Chamurappi:
A co kdybych z toho udelal funkci a pak ji zavolal ? vkalina: A sakra, ze by svetlo na konci tunelu ? |
||
Chamurappi Profil |
#24 · Zasláno: 13. 4. 2013, 18:49:32
Reaguji na 1Pupika1989:
Tohle bych mu neradil. Je schopné to zakousnout prohlížeč, než přijde odpověď. Reaguji na vkalinu: Z čeho? |
||
vkalina Profil |
#25 · Zasláno: 13. 4. 2013, 19:02:43
Chamurappi:
Myslel jsem to takto function prijemdat(){ x.onreadystatechange = function(){ if(x.readyState==4 && x.status==200){ var rE='"zacatek,'+x.responseText.split("|")+',konec"'; return rE; } } } |
||
Chamurappi Profil |
Reaguji na vkalinu:
Obalující funkce nehrají roli. Zkus si představit, že přijetí odpovědi ze serveru trvá nějakou nezanedbatelně dlouhou dobu. Třeba dva roky. Ty si pěkně přichystáš parametry požadavku, nastavíš událost do onreadystatechange , zavoláš send() … a hned poté si zbytek tvého skriptu hezky v klidu doběhne, všechny příkazy za send em se vykonají hned, stránka se klidně vykreslí, celé HTML bude pěkně načtené. Uživatel na tu stránku bez donačtených dat bude v tichosti koukat a napjatě čekat na odpověď ze serveru. Oslaví u ní dvoje Velikonoce, dvoje Vánoce, naroste mu plnovous (pokud není dítě, žena nebo indián). Dva roky uběhnou jako voda a najednou server odpoví — teprve v tu chvíli se zavolá funkce přiřazená do onreadystatechange a je už jen na ní, aby získaná data zpracovala. Skript kolem ní už dávno doběhl a ona nemůže ty informace poslat dva roky do minulosti. Je to už jasnější? To, že ve skutečnosti trvá přijetí odpovědi milisekundy a ne roky, nehraje roli. Princip je stejný.
|
||
vkalina Profil |
#27 · Zasláno: 14. 4. 2013, 09:18:27
Tomu rozumim, ale mel jsem dojem, ze kdyz zavolam funkci, tak script ceka, nez se provede a pak pokracuje dal. Kdyz dam za funkci do scriptu alert() tak ho taky nejprv musim potvrdit a pak teprve dojde k nacitani stranky. Tim nechci rict ze nemate pravdu, ze proste vytahnout udaje z onreadystatechange proste nejde.
|
||
_es Profil |
#28 · Zasláno: 15. 4. 2013, 09:52:52
vkalina:
„Ty jo, diky. Mě ale nejde o ten alert(), ten tam nebude. Já to potřebuju kvůli těm proměnným, abych podle nich mohl sestavovat obrázek viz.“ Tak prečo len jednoducho namiesto „toho alertu“ „nezostavuješ obrázok“? „mel jsem dojem, ze kdyz zavolam funkci, tak script ceka, nez se provede a pak pokracuje dal.“ Tá funkcia sa naozaj dokončí, ale ty v nej len nastavíš, čo sa má stať pri načítaní odpovede zo servera a skript beží ďalej. „ze proste vytahnout udaje z onreadystatechange proste nejde.“ Prečo chceš stále tie dáta nejako „vyťahovať“? Prečo s nimi nepracuješ vo funkcii priradenej do vlastnosti onreadystatechange ?
|
||
vkalina Profil |
#29 · Zasláno: 15. 4. 2013, 12:45:47
Já už to snad pochopil, teď jenom musím naštudovat, jak zacházet s tou funkcí innerHTML. Pořád jsem se tomu snažil vyhnout, ale už jsem pochopil, že to bez toho do webu nedostanu. Holt jsem zamrznul na PHPku, které je pro mě víc logický.
|
||
Časová prodleva: 3 dny
|
|||
vkalina Profil |
#30 · Zasláno: 18. 4. 2013, 23:09:05
Tekže, děkuji všem za trpělivost a tady je uz finale
http://62.209.235.84/user.htm Tak zas nekdy priste |
||
Časová prodleva: 11 let
|
0