Autor Zpráva
vkalina
Profil
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
Použij pole nebo objekt.
vkalina
Profil
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
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
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
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
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>
To aby ti nahodilo tie prvé hodnoty, ktoré sú už tam preddefinované.
vkalina
Profil
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
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
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
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
Jeste me napadla jedna prasarna, pokud bych pred koncem funkce zavolal //return// zůstanou mi načtené proměnné z funkce ?
1Pupik1989
Profil
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.......
Jak z to pres ten return vytahnu tu promenno rE ????
Chamurappi
Profil
Reaguji na vkalinu:
Nijak, ta funkce v onreadystatechange se odehrává jindy, než zbytek skriptu. Data stažená XMLHttpRequestem 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
Chamurappi:
A co kdybych z toho udelal funkci a pak ji zavolal ?


vkalina:
A sakra, ze by svetlo na konci tunelu ?
Chamurappi
Profil
Reaguji na 1Pupika1989:
Tohle bych mu neradil. Je schopné to zakousnout prohlížeč, než přijde odpověď.


Reaguji na vkalinu:
Z čeho?
vkalina
Profil
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 sendem 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
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
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
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ý.
vkalina
Profil
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

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: