2013-05-21 3 views
2

У меня есть веб-сервер, который создает вопросы для студентов определенного предмета. Веб-серверу необходимо отслеживать, сколько времени каждый студент потратил на определенный набор вопросов.Onunload, onbeforeunload - запрошенное руководство

Веб-страницы имеют кнопку «Готово», которая при нажатии вызывает отправку статистики на сервер.

Однако я также хочу, чтобы веб-браузер отправлял статистику, если ученик перемещается в сторону от страницы или закрывает окно браузера, не нажимая «Готово».

Для этой цели я планировал иметь «onunload» или «onbeforeunload» отправлять запрос Ajax на сервер с соответствующей информацией. Но, по-видимому, разные браузеры не полностью поддерживают эти события, а также существуют ограничения на то, что можно сделать в обработчиках событий. И, конечно, я не хочу, чтобы просмотр зависал, если связь с сервером терпит неудачу.

Итак, мне нужен совет по наилучшему способу сделать это.

+0

Я использовал onbeforeunload для отправки запросов AJAX по этой причине, и он работал в основных браузерах. Я не могу дать вам окончательный список того, что я тестировал, но вы должны знать, что это было сделано раньше. – RichieHindle

+0

Я использовал программное обеспечение, которое в ретроспективе, возможно, имело эту функцию. Мое воспоминание о том, что существуют ограничения на использование браузеров. Это нечестно, но я был бы склонен идти с линией, которая в основном говорила. «Требуются браузеры, совместимые с стандартом. Для завершения этого теста вы должны использовать браузер xx, yy или zz. Другие браузеры не могут гарантировать конфиденциальность ваших ответов и, как таковые, не поддерживаются» – enhzflep

+1

Вы не можете реализовать что-то, что не поддерживается браузеров (AJAX при разгрузке). Вместо отправки данных при выгрузке вам следует периодически отправлять данные на сервер. Затем, даже если вы закрываете браузер с помощью диспетчера задач или если он отключает (сетевой) кабель, у вас все еще есть некоторые данные. –

ответ

1

Если бы я хотел быть уверенным в обработке всех «специальных событий», я отправил бы тиковые «запросы» с веб-страницы на сервер. Гранулярность зависит от требований отслеживания, нагрузки и от того, является ли она интрасети или интернет-приложением; может быть несколько секунд или даже минута. Таким образом, вы отслеживаете время, проведенное на странице, даже если сбой браузера/os/network.

+0

Это, наверное, лучший способ сделать это. Спасибо, петерфольди. (Bounty будет награжден за несколько часов, когда система позволит мне.) – oz1cz

1

Лучшим способом реализации является использование обновлений периода. Это в значительной степени гарантирует, что у вас есть некоторые релевантные данные, когда пользователь каким-либо образом отключится.

Реализация довольно тривиальная, все, что вам нужно, чтобы реорганизовать часть вашей логики, чтобы отправлять обновления периода, а не все сразу.

function sendStatistics() 
{ 
    // ajax and what not 
} 

setInterval(function(){ 
    sendStatistics(); 
}, 1000); 

Другой способ заставить его работать, чтобы сделать ваш вызов ajax в beforeunload и сделать его синхронным. Это заморозит браузер для продолжительности вызова, а также будет работать только при навигации или закрытии браузера, я не рекомендую это.

Смежные вопросы