Avatar billede hypofysen Nybegynder
09. januar 2011 - 11:29 Der er 7 kommentarer og
1 løsning

problemer med flere XMLHttpRequests

jeg har to js functioner, som jeg kalder ved body onload showValue(45000002);

Men det er ikke alle XMLHttpRequests der bliver udført og dem der bliver udført får alle værdien fra den sidste, hvad gør jeg forkert?

function getValue(inst,id)
{
if (id=="")
  {
  document.getElementById(id).innerHTML="";
  return;
  }
if (window.XMLHttpRequest)
  {// code for IE7+, Firefox, Chrome, Opera, Safari
  xmlhttp=new XMLHttpRequest();
  }
else
  {// code for IE6, IE5
  xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
  }
xmlhttp.onreadystatechange=function()
  {
  if (xmlhttp.readyState==4 && xmlhttp.status==200)
    {
    document.getElementById(id).innerHTML=xmlhttp.responseText;
    }
  }

var url = "getCurrentValue.php?t=" + Math.random();
var params = "inst="+inst+"&component="+id;
xmlhttp.open("POST", url, true);
xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xmlhttp.setRequestHeader("Content-length", params.length);
xmlhttp.setRequestHeader("Connection", "close");
xmlhttp.send(params);
}

function showValue(inst)
{
    getValue(inst,'nHeatingProcesValueZone1');
    getValue(inst,'nHeatingProcesValueZone2');
    getValue(inst,'nHeatingProcesValueZone3');
    getValue(inst,'nHeatingProcesValueZone4');
    getValue(inst,'nHeatingProcesValueZone5');
    getValue(inst,'nHeatingProcesValueZone6');
    getValue(inst,'nHeatingProcesValueZone7');
    getValue(inst,'nHeatingProcesValueZone8');
    getValue(inst,'nHeatingProcesValueZone9');
    getValue(inst,'nHeatingProcesValueZone10');
    getValue(inst,'nHeatingProcesValueZone11');
    getValue(inst,'nHeatingProcesValueZone12');
    getValue(inst,'nHeatingProcesValueZone13');
    getValue(inst,'nHeatingProcesValueZone14');
    getValue(inst,'nHeatingProcesValueZone15');
    getValue(inst,'nHeatingProcesValueZone16');
}
Avatar billede hypofysen Nybegynder
09. januar 2011 - 12:42 #1
hvis jeg ændrer

xmlhttp.open("POST", url, true);
til
xmlhttp.open("POST", url, false);

så virker det i safari, chrome og ie men ikke i FF
Avatar billede tjens Nybegynder
09. januar 2011 - 15:12 #2
true er asynkront og har brug for onreadystatechange funktionen.
false er synkront, og her skal du flytte  document.getElementById(id).innerHTML=xmlhttp.responseText; til lige efter mlhttp.send(params);, i stedet for at definere en onreadystatechange funktion.


Men jeg tror at dit script fejler under asynkront, fordi du ikke gemmer xmlhttp objektet: Det bliver overskrevet inden svarene kommer tilbage.

Forslag: (til asynkron)
Prøv at slutte getValue() funktionen af med en return xmlhttp,
og så tilføj en global variabel i starten af hver linie i showValue():

    window.zone1Request = getValue(inst,'nHeatingProcesValueZone1');
    window.zone2Request = getValue(inst,'nHeatingProcesValueZone2');
    ... ...

Så er de mange samtidige requests helt adskildt.
Avatar billede hypofysen Nybegynder
09. januar 2011 - 16:49 #3
jeg er ikke helt med hvad forskellen er på synkront og asynkront.

Det første du skrev virkede, men forslag til asynkront kan jeg ikke få til at fungere, jeg læste et sted at det blev anbefalet atbruge asynkront er det rigtigt?
Avatar billede tjens Nybegynder
09. januar 2011 - 19:37 #4
Synkront har den ulempe at browseren bliver låst, mens data hentes:
Hvis serveren er langsom eller nede, bliver den øvrige funktionalitet på siden blokeret.

Men jeg har lavet mig en testside i stil med din kode i #0, og jeg kan ikke få den til at gå i fejl. Dermed er det svært at lave en rettelse.
Hvad sker der, når du tester denne http://tjens.dk/eksperten/928408/ ?
Hvordan ser jeg fejlen?

PHP-siden bag ved min test har denne kode:
<?php  echo 'Data is ['.$_POST["data"].']';  ?>
og der er bare en række id'er i HTMLen med id=det nummer som sendes til PHP.
Avatar billede hypofysen Nybegynder
09. januar 2011 - 20:33 #5
Du kan se siden her: http://solidhouse.dk/sh_cms/testJava/testJava.php

jeg har følgende filer:

testJava.php
getCurrentValue.php
js/callCurrentValues.js
js/getCurrentValues.js

smo ser ud som følger i nævnte rækkefølge:

testJava.php:
<html>
<head>
<script type="text/javascript" src="js/getCurrentValues.js"></script>
<script type="text/javascript" src="js/callCurrentValues.js"></script>

<style>
#txtHint
{
width: 200px;
height: 200px;
float: left;
background: #ccc;
position: relative;
}
#txtHint1
{
width: 200px;
height: 200px;
float: right;
background: #eee;
position: relative;
}

</style>
</head>
<body>
<table cellpadding="0" cellspacing="0" width="500">
<form>
<thead>
    <tr>
        <th>Beskrivelse</th>
        <th>Setpunkt</th>
        <th>Aktuel værdi</th>
    </tr>
</thead>
<tbody>
<?php
$i = 1;
while($i <= 16)
{
print "
    <tr>
        <td>Zone ".$i."</td>
        <td><input type=\"text\" name=\"nHeatingProcesValueZone".$i."New\" value=\"\" /></td>
        <td>
            <div id=\"nHeatingProcesValueZone".$i."\">
                Henter værdi
            </div>
        </td>       
    </tr>
";
    $i++;
}
?>

</tbody>
</form>
</table>
<script type="text/javascript">
    window.onload = showValue(45000002);
</script>
</body>
</html>
-----------------------------------------------

getCurrentValue.php:
<?php
$inst = $_POST['inst'];
$component = $_POST['component'];

$con = mysql_connect('localhost', 'sh_user', 'sh_useruser');
if (!$con)
  {
  die('Could not connect: ' . mysql_error());
  }

mysql_select_db("sh_installation", $con);

$sql="SELECT value FROM data_varheating WHERE inst_id = ".$inst." AND component = '".$component."'";

$query = mysql_query($sql);
$result = mysql_fetch_array($query);

print $result['value'];

mysql_close($con);

?>

js/callCurrentValues.js:
function showValue(inst)
{
    getValue(inst,'nHeatingProcesValueZone1');
    getValue(inst,'nHeatingProcesValueZone2');
    getValue(inst,'nHeatingProcesValueZone3');
    getValue(inst,'nHeatingProcesValueZone4');
    getValue(inst,'nHeatingProcesValueZone5');
    getValue(inst,'nHeatingProcesValueZone6');
    getValue(inst,'nHeatingProcesValueZone7');
    getValue(inst,'nHeatingProcesValueZone8');
    getValue(inst,'nHeatingProcesValueZone9');
    getValue(inst,'nHeatingProcesValueZone10');
    getValue(inst,'nHeatingProcesValueZone11');
    getValue(inst,'nHeatingProcesValueZone12');
    getValue(inst,'nHeatingProcesValueZone13');
    getValue(inst,'nHeatingProcesValueZone14');
    getValue(inst,'nHeatingProcesValueZone15');
    getValue(inst,'nHeatingProcesValueZone16');
}

js/getCurrentValues.js:
function getValue(inst,id)
{
if (id=="")
  {
  document.getElementById(id).innerHTML="";
  return;
  }
if (window.XMLHttpRequest)
  {// code for IE7+, Firefox, Chrome, Opera, Safari
  xmlhttp=new XMLHttpRequest();
  }
else
  {// code for IE6, IE5
  xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
  }
xmlhttp.onreadystatechange=function()
  {
  if (xmlhttp.readyState==4 && xmlhttp.status==200)
    {
    document.getElementById(id).innerHTML=xmlhttp.responseText;
    }
  }

var url = "getCurrentValue.php?t=" + Math.random();
var params = "inst="+inst+"&component="+id;
xmlhttp.open("POST", url, true);
xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xmlhttp.setRequestHeader("Content-length", params.length);
xmlhttp.setRequestHeader("Connection", "close");
xmlhttp.send(params);
}
Avatar billede tjens Nybegynder
09. januar 2011 - 22:08 #6
Det er variabel xmlhttp, der bliver global, og dermed kun eksisterer i 1 instans.

Prøv at indsætte en var xmlhttp; i starten af function getValue.
Avatar billede hypofysen Nybegynder
09. januar 2011 - 22:11 #7
Det var det, så var det ikke jo helt galt det jeg havde lavet :)

Tusinde tak for hjælpen! smid et svar
Avatar billede tjens Nybegynder
10. januar 2011 - 16:36 #8
OK
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester