регистратор сердцебиения - PullRequest
1 голос
/ 10 декабря 2010

хорошо, я опубликовал «раздражающий всплывающий» вопрос, в качестве решения для «регистрации» чьего-то времени, проведенного на странице, общий консенсус заключался в том, чтобы использовать вызов ajax для таймера, чтобы сообщить серверу, что пользователь был все еще на странице ... (ниже приведен код, который я использую).

одна проблема, которую я имею, это то, что httRequest, похоже, кешируется ... при каждом возврате отображается та же "отметка времени" ...

<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 (/*@cc_on!@*/false) {
    document.onfocusin = onFocus;
    document.onfocusout = onBlur;
} else {
    window.onfocus = onFocus;
    window.onblur = onBlur;
}

</script>

Код для "ajax-on-time-interval.cfm" # Теперь () #

Ответы [ 3 ]

1 голос
/ 10 декабря 2010

IE выполняет кеширование Ajax-запросов. Чтобы остановить это, я обычно просто добавляю случайную переменную в свой запрос:

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); 
}

Это должно работать до тех пор, пока вы не анализируете новую 'random' переменную на сервере: -)

1 голос
/ 10 декабря 2010

Вы можете сделать запрос HEAD вместо полного получения, если вы просто пингуете сервер и не заботитесь о том, что возвращается.

Также использование синхронного запроса является ОЧЕНЬ ПЛОХОЙ идеей. Это означает, что если подключение к серверу по какой-либо причине плохое, браузер пользователя зависнет, и он не сможет ничего сделать. Проверьте это, добавив долгое время сна на ваш серверный код и поиграйте со страницей. Вашему пользователю не понравится этот тип пинга, поэтому поменяйте его на асинхронный.

Чтобы остановить кеширование, вы должны установить правильные заголовки в вашем серверном коде для начала. Если вы не установите правильный, браузер будет кэшировать страницу. Именно это и делают запросы get, чтобы сделать ваш просмотр более эффективным.

Если вы хотите, чтобы он всегда получал самые новые, проще всего добавить изменяемое значение строки запроса. Math.random () является распространенным выбором, но лучшим выбором будет new Date().getTime(), так как это всегда разные значения на одной машине.

"ajax-on-time-interval.cfm?ts=" + (new Date().getTime())
0 голосов
/ 10 декабря 2010

Я думаю, вы можете использовать

$.ajaxSetup({
cache: false
});

или что-то в этом роде ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...