Avatar billede simsen Mester
14. april 2010 - 00:51 Der er 7 kommentarer og
1 løsning

Javascript onclick som skal hente php side (Ajax) virker ikke

Hej,

Med min nedenviste kode, vil jeg:

1) Opdatere en tidsstempel (den virker)
2) Hente en php fil som pt. kun indeholder et navn i hver række

Når jeg loader siden første gang, så henter den fint navnene og viser dem, men når jeg så opdaterer php filen med et navn og klikker på knappen, opdaterer den ikke navnelisten.

Hvad gør jeg forkert i følgende kode:

html kode:
<head runat="server">
    <title></title>
    <script src="RefreshChat.js" type="text/javascript"></script>
</head>
<body onload="refreshUserList()">
    <form runat="server">
    <div id="refreshUserChatList">   
        Opdateret sidst: <div id="digits" style="display: inline"></div> <input type="button" id="btnUpdateUsersList" value="Opdater" onclick="refreshUserList()" />
       
        <div id="userChatList"></div>
    </div>
    </form>
</body>

Javascript kode:
function datetime() {
    var datetime = new Date()
    var hr = datetime.getHours()
    var min = datetime.getMinutes()
    if (hr < 10) {
        hr = " " + hr
    }
    if (min < 10) {
        min = "0" + min
    }
    document.getElementById("digits").innerHTML = hr + ":" + min
}


function refreshUserList() {

    //Her opdateres tid
    datetime();

    //Her hentes siden med brugere på chatten
    xmlhttp = GetXmlHttpObject();
    if (xmlhttp == null) {
        alert("Browser does not support HTTP Request");
        return;
    }
    var url = "getUserList2.php";
    xmlhttp.onreadystatechange = stateChanged;
    xmlhttp.open("GET", url, true);
    xmlhttp.send(null);

}

function stateChanged() {
    if (xmlhttp.readyState == 4) {
        document.getElementById("userChatList").innerHTML = xmlhttp.responseText;
    }
}

function GetXmlHttpObject() {
    if (window.XMLHttpRequest) {
        // code for IE7+, Firefox, Chrome, Opera, Safari
        return new XMLHttpRequest();
    }
    if (window.ActiveXObject) {
        // code for IE6, IE5
        return new ActiveXObject("Microsoft.XMLHTTP");
    }
    return null;
}

PHP side:
<div class="sidebarBox">
  Søren<br />
  Peter<br />
  Peter<br />
</div>

Og inden I spørger - php siden kommer der noget database udtræk - som jeg ved virker - har bare ikke apache server installeret på min side - så er nødt til at gøre lige som om :-)

mvh
simsen :-)
Avatar billede sluppermanden Nybegynder
14. april 2010 - 00:57 #1
Der er muligvis cache på.
Prøv at tilføje en dummy parameter som random ændres ved hvert kald.
Avatar billede simsen Mester
14. april 2010 - 01:06 #2
Jeg forsøgte med

var url = "getUserList2.aspx";
    url = url + "&sid=" + Math.random();

(ændrede det til en aspx fordi jeg fik en fejl og troede det havde noget at gøre med det er en php side, jeg henter ind på en aspx side)

Men nu fejler den så hele tiden og skriver følgende:

The resource cannot be found.
Description: HTTP 404. The resource you are looking for (or one of its dependencies) could have been removed, had its name changed, or is temporarily unavailable.  Please review the following URL and make sure that it is spelled correctly.

Requested URL: /JQuery/getUserList2.aspx&sid=0.17888791248177005
Avatar billede simsen Mester
14. april 2010 - 01:16 #3
Hvis jeg nu ikke sov mere end jeg er vågen på nuværende tidspunkt - så ville jeg ikke lave alle de fejl....

Når jeg forsøger mig med php og tilføjer et navn virker det - du havde ret. Tak for hjælpen :-)
Avatar billede olebole Juniormester
14. april 2010 - 11:23 #4
<ole>

Bare bruge post i stedet for get. Så cacher IE ikke  ;o)

/mvh
</bole>
Avatar billede sluppermanden Nybegynder
15. april 2010 - 10:36 #5
@ole
Det er ikke altid det virker.
Nu har jeg lavet en del test på det og fundet frem til at i IE er det sikreste at fjerne cache fra den side som bliver hentet via AJAX.

Dette kan gøres ved at tilføje en header.

E.g.
<?php
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache"); 
?>
Avatar billede olebole Juniormester
18. april 2010 - 19:17 #6
Jeg har arbejdet med Ajax og pre-Ajax teknikker i 10 år, så jeg er ikke i tvivl om, hvordan man udfører cache control på serveren. Men kan du ikke lige vise os de test, du har lavet, som du mener gør, at IE cacher siden, når du bruger post.

Det er aldrig lykkedes mig at få IE til at cache ved post - jeg har aldrig læst/hørt om nogen, der har været ude for det - og rent teknisk kan jeg ikke forestille mig, hvad der skulle få det til at ske  =)
Avatar billede sluppermanden Nybegynder
18. april 2010 - 22:13 #7
Prøvede lige at vende tilbage til den test jeg havde lavet.
Og nu virkede det selvfølgelig med POST.
Da jeg ændre metoden tilbage til GET blev siden cachet.

Men...
Da jeg så ændrede metoden tilbage til POST igen, blev den ved med at cache siden.

Så det var derfor at jeg nåede til den konklusion.
Så det er kun rent teknisk at man kan snyde sig selv.
Jeg har dog ingen forklaring på dette.

Du kan jo afprøve det selv.

___ajax.php___
<div id="screen">Tagwall loades...</div>
<div id="status">Status</div>

<script language="JavaScript" type="text/javascript">
var getid  = getXmlHttpRequestObject();
var id = "";
function getXmlHttpRequestObject() {
if (window.XMLHttpRequest) {
return new XMLHttpRequest();
} else if(window.ActiveXObject) {
return new ActiveXObject("Microsoft.XMLHTTP");
}
}

function update(){
getid.onreadystatechange=lastid;
var randomnumber=Math.floor(Math.random()*10001)
url = 'random.php?'
getid.open("POST","random.php",true);
getid.send(null);
setTimeout('update();',1000);
}

function lastid(){
if (getid.readyState==4) {
  document.getElementById("screen").innerHTML = getid.responseText;
  document.getElementById("status").innerHTML = getid.status;

}
}
update();
</script>

___random.php___
<?php
//header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
//header("Cache-Control: no-store, no-cache, must-revalidate");
//header("Cache-Control: post-check=0, pre-check=0", false);
//header("Pragma: no-cache"); 
srand(time());
$random = (rand()%9999);
print("random number between 0 and 9999 is: $random");
?>
Avatar billede olebole Juniormester
18. april 2010 - 22:45 #8
Det er muligt, at du kan fremtvinge en fejl på den måde. Det er dog ikke et realistisk scenarium i den virkelige verden, så jeg tror på dig og springer testen over  =)
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