webForumDet fria alternativet

kolla efter nya meddelande utan siduppdatering?

JavaScriptur Javascript

53 svar · 2 991 visningar · startad av vagann

Medlem sedan juli 2011171 inlägg
Frågan#1

hej , jag ville göra så att sidan visar om man har ett nytt meddelande utan att användaren behöver uppdatera sidan...

så jag kom fram till

var check;
function checkForMessages() {
    $.get("/page.php", function($newpm_sql) {
        if($newpm_sql >= 1) {
                      clearTimeout(check);
            alert("nytt meddelande!");
        }
    }
}

setInterval(checkForMessages, 60000);-

det är en kod som jag skrev eftersom jag inte kan sånt så bra så vill jag att kolla upp koden , är den rätt? skulle den funka`?

Medlem sedan juni 20019 519 inlägg
#2

Du sätter ju aldrig variablen check till en timeout/interval, så att cleara den hjälper inte något, sen skall din /page.php retunera ett nummer (även om den kommer returnera en sträng).

Sen gillar jag inte setInterval... metoden kan ju ta mer än 6 sekunder att köra (även om det inte är i detta fallet)

Medlem sedan juli 2003221 inlägg
#3

Det ser väl bra ut, om nu page.php returnerar hur många nya meddelanden som finns. Fungerar det inte?

Medlem sedan juli 2011171 inlägg
#4

kan du eller någon som har lust att fixa det jag har missat? , som sagt eftersom jag är inte så bra på sånt:)

Medlem sedan juni 20019 519 inlägg
#5

är ju svårt att säga då jag har ingen aning om vad din page.php retunera för data.

Medlem sedan juli 2011171 inlägg
#6

jag tror att du frågar efter detta ?

$newpm_sql = mysql_query("SELECT `id` FROM `pm` WHERE `to` = '". $_SESSION['id'] ."' AND `status` = '0'") or die(mysql_error());
Medlem sedan juni 20019 519 inlägg
#7

och den retunera vad? ett tal alltid?

Medlem sedan juli 2011171 inlägg
#8

nej , inte om det inte finns minst 1 meddelande , egentligen så körde jag message alert med php :

$newpm_sql = mysql_query("SELECT `id` FROM `pm` WHERE `to` = '". $_SESSION['id'] ."' AND `status` = '0'") or die(mysql_error());
if (mysql_num_rows($newpm_sql) >= 1)
{ $newpm = ' <b>('. mysql_num_rows($newpm_sql) .')</b>'; }
else
{ $newpm = ''; }

men eftersom den inte uppdateras av sig själv så vill jag kör ajax/javascript

Medlem sedan juni 20019 519 inlägg
#9

Nu blandar du PHP och javascript. för det första så är PHP ett server språk och javascript är ett klientspråk för webbläsaren, $newpm måste skrivas ut på php sidan då javascript inte har någon som helst tillgång till några server variabler.

Nu känner jag att jag måste förklara lite hur jquery.get fungera:

get har en callback metod:

$.get("/page.php", function($newpm_sql) {
        if($newpm_sql >= 1) {
        }
    });

i denna kod-block så är det function($newpm_sql) {} som är det callback block som kommer köras så fort ajax anropet har lyckats. Metoden har en parameter och det är den data som retuneras ifrån servern ( i ditt fall verkar det inte vara något då du inte har echo på $newpm, men vi säger att du har detta och då kommer $newpm_sql innehålla ' <b>(xxx)</b>' eller ''

Om vi har en HTML markup på sidan som ser ut som:

<div id="new_pm"></div> eller om du nu presentera $newpm från php (samma resultat som i din page.php)

så kan du ha:

var checkForMessages = function() {
	$.get("/page.php", function($newpm_sql) {
        $("#new_pm").html($newpm_sql);
    }
};

Så kommer den uppdatera DOM-elementet med ett id med #new_pm med datan som ajax anropet får från serven.

jag hade gjort Javascripts koden:

var checkForMessages = function() {
	$.get("/page.php", function(data) {
        $("#new_pm").html(data);
		check = setTimeout(checkForMessages, 6000);
    }
});
var check = setTimeout(checkForMessages, 6000);

för att den bara skall hämta varje 6 sekund efter en lyckad hämtning av page.php

Medlem sedan juli 2011171 inlägg
#10

ok tack för förklaringen, nu tror jag att jag fattar hur det går till .. och det är bara det , behöver inte lägga nåt mer i html strukturen , right?
går och testar den nu :D

Medlem sedan juni 20019 519 inlägg
#11

page.php behöver bara retunera det du vill presentera i #new_pm

Medlem sedan juli 2011171 inlägg
#12

ok så blev det för mig (detta är i page.php ,head delen medan diven är i body.php)

<script type="text/javascript">var checkForMessages = function() {
	$.get("/page.php", function(data) {
        $("#userbar").html(data);
		check = setTimeout(checkForMessages, 6000);
    }
};
var check = setTimeout(checkForMessages, 6000);
</script>

men det funkade inte, har jag gjort fel nånstans?

Medlem sedan juni 20019 519 inlägg
#13

lägg upp koden eller berätta vad konsollen säger att det bli för fel.

Medlem sedan juni 20019 519 inlägg
#14

det saknas ) i koden:

var checkForMessages = function() {
	$.get("/page.php", function(data) {
		$("#userbar").html(data);
		check = setTimeout(checkForMessages, 6000);
	});
};
var check = setTimeout(checkForMessages, 6000);

demo: http://jsbin.com/otusoz/edit#javascript,html,live

Medlem sedan juli 2011171 inlägg
#15

vilken kod begär du ?

Medlem sedan juni 20019 519 inlägg
#16

Ingen längre, provade koden och fick felmeddelande direkt om att metoden aldrig avslutas.

Medlem sedan juli 2011171 inlägg
#17

jaha ok , det är ganska konstigt att min server ger inga felmeddelande.. men hur som helst så såg jag att funkade jsbin och jag har exakt samma koder men ett problem har uppstått att sidan anropar page.php i ett annat sida tex ...page.php?name=pm så vi kanske bör uppdatera utan att anropa ett specifikt file .

ps: jag tror att min server har bannat mig ,för att nå min hemsida måste jag använda proxy, jag ska fixa det, återkommer lite senare:)

Medlem sedan juni 20019 519 inlägg
#18

Servern kan bara generera ett fel och det vid ajax anropet, men det är felaktig JS struktur så säger webbläsaren till att det är fel (de flesta webbläsare har en konsol/felkonsol)

vad få du för html kod när du besöker page.php direkt?

Medlem sedan jan. 2005713 inlägg
#19

Får en känsla att det är echo som saknas, vi har varit inne på det här förut jag och Vagann.

Om du skriver PHP och du vill att något ska visas på sidan så måste du använda dig av echo.

$str = "Hello world!";
echo $str;

(Finns lite andra varianter också men det får du läsa om här.)

Samma sak gäller när du använder dig av ajax, skriv dina php script precis som vanligt, det som ska visas för användaren måste ekas (echo) ut helt enkelt.

Jag antar att det här INTE är hela PHP koden, MEN om det skulle vara det så skulle det räcka med ett lite echo $newpm längst ner.

$newpm_sql = mysql_query("SELECT `id` FROM `pm` WHERE `to` = '". $_SESSION['id'] ."' AND `status` = '0'") or die(mysql_error());
if (mysql_num_rows($newpm_sql) >= 1)
{ $newpm = ' <b>('. mysql_num_rows($newpm_sql) .')</b>'; }
else
{ $newpm = ''; } 

echo $newpm;

Så skulle $newpm; matas ut på sidan och det kommer tillbaka till function(data).

Och beror det inte på detta så fortsätter vi felsökningen, men du får kanske visa mer av php koden, för ajax scriptet är ju i sin ordning.

Medlem sedan juli 2011171 inlägg
#20

voigtann här är html koden

<head>
<meta name="keywords" content="" />
<meta name="description" content="" />
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
<title>test </title>
<link href="styles/snowglass/style.css" rel="stylesheet" type="text/css" media="screen" />
<script  src="http://code.jquery.com/jquery-1.7.2.min.js"></script>
<script type="text/javascript">
var checkForMessages = function() {
	$.get("/page.php", function(data) {
		$("#userbar").html(data);
		check = setTimeout(checkForMessages, 6000);
	});
};
var check = setTimeout(checkForMessages, 6000);
</script>
</head>

säg till om du behöver hela html koden !

stattin , jo det var hela php koden och jag använder mig redan av echo för att skriva ut antal meddelande men det som vi försöker göra här är att få antal meddelande att uppdatera sig utan siduppdatering.... just nu är det så att användaren måste uppdatera sidan (f5) för att antal meddelande ska också uppdateras

136 ms totalt · 3 externa anrop · v20260731065814-full.4bcf49fe
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
134 ms — hämta tråd, inlägg och bilagor (db)