Раздражающее всплывающее окно - (или другое более изящное решение) - PullRequest
0 голосов
/ 07 декабря 2010

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

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

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

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

У кого-нибудь есть решение для этого? Я знаю, что все это похоже на «плохой» дизайн, но если у кого-то есть «правильный» способ справиться с этим сценарием - пожалуйста, скажите мне. (Кстати, IE является требованием - это требование IE7 на основе интрасети.) 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 (/*@cc_on!@*/false) {
    document.onfocusin = onFocus;
    document.onfocusout = onBlur;
} else {
    window.onfocus = onFocus;
    window.onblur = onBlur;
}

</script>

Ответы [ 3 ]

3 голосов
/ 07 декабря 2010

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

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

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

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

if (/*@cc_on!@*/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

0 голосов
/ 07 декабря 2010

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

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