синхронная запись AJAX из события unload: как обеспечить, чтобы пользователь видел самую актуальную информацию из БД при загрузке следующей страницы - PullRequest
3 голосов
/ 09 февраля 2010

Когда пользователь запрашивает редактирование записи в нашей CMS, мы «блокируем» ее, чтобы никто другой не мог редактировать ее одновременно, мы снимаем блокировку, когда они отправляют свои изменения. Однако нам нужно разобраться со случаем, когда пользователь покидает страницу по другим ссылкам ... Моя первая попытка - использовать jQuery для запуска синхронного $.ajax() вызова на $(window).unload. Это работает, однако на следующей странице, которую видит пользователь, запись кажется заблокированной (при условии, что они возвращаются на страницу со списком всех записей, возможно, с помощью кнопки «Назад»). Простое обновление этой страницы показывает, что запись снова готова для редактирования.

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

var fire_unload_ajax = true; // certain things set this to false, not relevant
$(window).unload(function() {
    if(fire_unload_ajax && $("#reset-entry-lock form").length == 1) {
        $.ajax({
            url: window.location.href,
            async: false,
            cache: false,
            type: "POST",
            data: $("#reset-entry-lock form").serialize()
        });
    }
});

Ответы [ 2 ]

2 голосов
/ 31 марта 2010

Я решил похожую проблему в недавно написанном приложении.

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

Для пользователей Opera (и т. Д.) Я намеревался, чтобы блокировки автоматически истекали каждую минуту или около того, и каждые 30 секунд выполнял асинхронную обратную передачу из моего приложения, чтобы обновить блокировки. Таким образом, пользователи, которые перемещались в другое место, освобождали свои блокировки, даже если событие unload не было запущено. К сожалению, мой проект был отменен до того, как он был реализован.

0 голосов
/ 10 февраля 2010

Вы можете отправлять состояние формы с помощью асинхронного AJAX POST каждые пять минут или около того, как это делает Gmail при написании сообщения. Как я объяснил в моем комментарии, вы не можете полагаться на onbeforeunload.

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