2010-12-07 3 views
0

Вот моя «необходимость» - у меня есть пользователь, открывающий окно с отображаемым документом, мне нужно записать количество времени, которое пользователь имеет в этом окне «в фокусе» или « открыт "... ЕСЛИ пользователь просматривает другое окно, я хочу прекратить протоколировать время - и возобновить ведение журнала, если они снова сосредоточится на этой странице ... В основном я хочу« знать », сколько времени потребовалось пользователю для чтения стр.Annoying Popup - (или другое более изящное решение)

это сценарий типа обзора, в котором пользователи являются «доверенными» членами, которым необходимо регистрировать свое время ... Я хочу сохранить «общее количество» только для справки, поэтому, если пользователь говорит, что потратил 10 мин, на странице, но мой журнал показывает, что окно было открыто только на 2 минуты, я знаю, что у меня проблема ... с моим кодом или с моими людьми ..;)

Я думал, что нужно сохранить js counter, когда страница была в фокусе, пауза на размытии или при закрытии и Ajax данные обратно на мой db ... и добавляет любое последующее время к этой записи, если пользователь возвращает ...

onUnload doesn ' t, похоже, работает, по крайней мере, когда я пытаюсь - плюс он не поймает закрытие браузера ... так что я был думая, что я могу запустить новое окно, когда окно документа закрыто (чтобы не раздражать - но чтобы сделать вызов журнала на сервер, а затем закрыть сам).

У кого-нибудь есть решение для этого? Я знаю, что все это «плохой» дизайн, но если у кого-то есть «правильный» способ справиться с этим сценарием, пожалуйста, скажите мне. (BTW- IE является requirement- это интранет на основе IE7 REQ.) Thx

======== пример кода - это 'не' работает ... вроде ======= ===== Когда я говорю, что это НЕ работает, это то, что я имею в виду ... «Сделано XMLHttpRequest», я предполагаю, потому что ответ - это сообщение, которое я ожидал бы - ОДНАКО, журнал не изменяется (Я знаю, что вы скажете, что это страница php, но если я сразу же назову URL-адрес - он отлично работает ... так что это не страница ведения журнала. В ДОПОЛНЕНИИ 60 секунд setInterval(), кажется, срабатывает случайно, потому что мое ответное сообщение просто всплывает, иногда 10 раз подряд, без промежутка времени между ними, конечно, не на «регулярных» интервалах в 60 секунд ... МЫСЛИ?

<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() { 
    //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.php", 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> 
+0

Вот неполный пример ДВУХ вещей, которые я пытаюсь сделать ... https://applynowdc1.chase.com/FlexAppWeb/renderApp.do?CELL = 6RQW & MSC = S02 & PROMO = DF01 & SPID = CSJN Эта страница запускает тип div, когда вы выходите за пределы страницы, и имеет функцию тайм-аута, поэтому она запускает счетчик ... Я ' ve попытался очистить код, чтобы подбирать мое решение - не повезло ... – jpmyob 2010-12-07 20:45:26

+0

`window` не имеет события` focus` ... – jwueller 2010-12-07 20:46:01

+0

Вы можете отредактировать свой оригинальный пост и добавить его туда. – jwueller 2010-12-07 20:46:23

ответ

3

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

Это, я полагаю, что JavaScript будет включен на этих машинах. (Кажется справедливым, исходя из вашего вопроса.)

0

Одно небрежное решение, частично разрешающее проблему с закрытием/сбоем браузера, состоит в том, чтобы иметь функцию ajax, которая связывает серверную БД с заданным интервалом, в то время как документ находится в фокусе. Таким образом, если клиент выйдет из строя, вы будете точны в течение 30 секунд после того, как долго документ был открыт.

1

window.onfocus и onblur задокументированы в MDC, но они не стандарты. Очевидно, что у IE есть document.onfocusin и .onfocusout:

if (/*@[email protected]*/false) { // check for Internet Explorer 
    document.onfocusin = onFocus; 
    document.onfocusout = onBlur; 
} else { 
    window.onfocus = onFocus; 
    window.onblur = onBlur; 
} 

Я не пробовал. Я просто читал об этом здесь. http://www.thefutureoftheweb.com/blog/detect-browser-window-focus