Как я могу сделать асинхронный вызов в элементе onavload Javascript? - PullRequest
2 голосов
/ 16 февраля 2009

У меня есть система, в которой элементы заблокированы (с флагом в базе данных), когда пользователь просматривает этот элемент.

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

Однако, когда пользователь покидает страницу любым способом, я хотел бы позвонить на страницу webservice / ashx, которая разблокирует элемент, но не остановит изменение страницы.

Ответы [ 4 ]

2 голосов
/ 16 февраля 2009

А как насчет использования функции «сердцебиение» для поддержания блокировки во время загрузки страницы? Сделайте серверный вызов каждые, скажем, 15 секунд или около того, чтобы возобновить блокировку. Запрограммируйте свой код на стороне сервера так, чтобы время ожидания блокировки истекло через 20 секунд, если он не услышал «сердцебиение» со страницы. Когда пользователь уходит со страницы, сердцебиение прекращается, и блокировка снимается максимум через 20 секунд.

2 голосов
/ 16 февраля 2009

То, что вы описываете, невозможно. Поток / среда выполнения JavaScript находится в пределах области загруженной страницы, поэтому при выгрузке страницы также выгружается JavaScript. Когда асинхронный вызов возвращается, и браузер отошел от страницы, пользователь получит ошибку JS.

Вы можете сделать ваш веб-сервис / вызов AJAX синхронным и заблокировать до тех пор, пока сервер не вернет ответ, но, конечно, это означает, что страница будет ожидать ответа перед выгрузкой.

1 голос
/ 16 февраля 2009

Мне удалось заставить это работать в IE7 и Firefox 3 с помощью события body onbeforeunload. Я использую XmlHttpHandler для вызова http-обработчика asp.net, который открывает запрос. Я должен был установить обработчик события измененного состояния, чтобы быть нулевым, чтобы не было никакой ошибки javascript, когда это возвратило.

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

0 голосов
/ 16 февраля 2009

Я думаю, вы должны сделать синхронный XHR-вызов на ваш сервер.

Если вы используете jQuery:

$.ajax({
  async:false,
  url:"your_page.html",
  data:"unlock=true",
  type:"POST"
}).responseText;

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

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