2010-12-09 6 views
1

ok, j'ai posté une question 'popup ennuyeux', comme une solution pour 'consigner' le temps passé sur une page, le consensus général était d'utiliser un appel ajax sur un timer pour rapporter à la serveur que l'utilisateur était encore sur la page ... (ci-dessous est le code que je cam avec)."heartbeat" logger qustion

une question que j'ai est le httRequest semble être mis en cache ... retour Evey montre la même « horodatage » ...

<script type="text/javascript"> 

var closeMe = 0; 
var logMe = 0; 

//the window doesn't have focus, do nothing or something that let's them know we're not logging at the moment 
function onBlur() { 
    ///stop the log interval 
    clearInterval (logMe); 
    //after 2 min of non focus, close it. 
    closeMe = setInterval('window.close()',120000); //after 2 min of non focus, close it. 
} 

//the window has focus... keep logging. 
function onFocus(){ 
    //stop the close counter - in the event to 'blurred' sometime 
    clearInterval (closeMe); 
    //run the AJAX on a schedule - we're doing it every minute - bu tyou can do it as often as you like 
    logMe = setInterval('logTime()',60000); 
} 

//call a script that logs another minute... 
function logTime() { 
    var xhReq = new XMLHttpRequest(); 
    xhReq.open("GET", "ajax-on-time-interval.cfm", false); 
    xhReq.send(null); 

    var serverResponse = xhReq.responseText; 
    alert(serverResponse); 
} 

// check for Internet Explorer... IE uses 'onfocusin/out" - everything else uses "onfocus/blur" 
if (/*@[email protected]*/false) { 
    document.onfocusin = onFocus; 
    document.onfocusout = onBlur; 
} else { 
    window.onfocus = onFocus; 
    window.onblur = onBlur; 
} 

</script> 

Le code pour le « ajax-sur-intervalle de temps. cfm » #now() #

Répondre

-1

Je pense que vous pouvez utiliser

$.ajaxSetup({ 
cache: false 
}); 

ou ses quelque chose comme ça ...

+0

Et où voyez-vous jQuery dans ce code? – epascarello

+1

Selon l'exemple de code donné, il semble que jQuery ne soit pas utilisé. – developmentalinsanity

1

IE met en cache les requêtes Ajax. Pour arrêter que je viens d'ajouter normalement une variable aléatoire à ma demande:

function logTime() { 
    var xhReq = new XMLHttpRequest(); 
    xhReq.open("GET", "ajax-on-time-interval.cfm?random="+Math.random(), false); 
    xhReq.send(null); 

    var serverResponse = xhReq.responseText; 
    alert(serverResponse); 
} 

Cela devrait fonctionner aussi longtemps que vous n'êtes pas l'analyse de la nouvelle variable « aléatoire » sur le back-end :-)

+2

Je pense que l'approche la plus standard est d'utiliser un horodatage - Date.now(). ToString() – Matt

+0

@matt qui le garde à un type int par opposition à un double aléatoire. belle suggestion – wajiw

1

Vous pouvez vous contenter de faire une requête HEAD au lieu d'une requête complète si vous ne faites que pinger le serveur et que vous ne vous souciez pas de ce qui revient.

L'utilisation d'une requête synchrone est également une idée TRES MAUVAISE. Cela signifie que si la connexion au serveur est mauvaise pour une raison quelconque, le navigateur de l'utilisateur se bloquera et il ne pourra rien faire. Testez-le en ajoutant un long temps de repos sur votre code serveur et jouez avec la page. Votre utilisateur ne va pas profiter de ce type de ping donc échangez-le pour asynchrone.

Pour arrêter la mise en cache, vous devez d'abord définir les en-têtes appropriés sur votre code serveur. Si vous ne définissez pas le bon, le navigateur mettra en cache la page. C'est ce que les requêtes sont censées faire pour rendre votre navigation plus efficace.

Si vous voulez forcer à toujours prendre la dernière chose, la chose la plus facile à faire est d'ajouter une valeur de chaîne de requête qui change. Math.random() est un choix commun, mais un meilleur choix est new Date().getTime() car il s'agit toujours d'une valeur différente sur la même machine.

"ajax-on-time-interval.cfm?ts=" + (new Date().getTime()) 
Questions connexes