Обновить страницу для всех онлайн-пользователей

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

Итак, я попробовал это в своем сценарии:

function save_match() {
    ...
    alert("Saved slot " + slot + "! :)");
    window.location.reload();
}

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

Принудительная перезагрузка страницы кажется маловероятной, так как насчет того, чтобы сделать что-то с помощью JavaScript, чтобы уведомить других онлайн-пользователей об инциденте сохранения?

Возможный связанный с этим вопрос.


Итак, что я хочу, так это:

function save_match() {
    ...
    alert("Saved slot " + slot + "! :)");
    // do something here so that all online users are updated!!
}

person gsamaras    schedule 13.01.2015    source источник
comment
Я хочу, чтобы уведомление происходило при сохранении, поэтому мне нужно что-то в конце save_match(). @PaulG   -  person gsamaras    schedule 14.01.2015
comment
Javascript не может сделать это сам по себе. Вам необходимо создать непрерывное соединение между всеми онлайн-пользователями с сервером.   -  person kappaallday    schedule 14.01.2015
comment
Есть пример @hardcoresquirrel?   -  person gsamaras    schedule 14.01.2015
comment
Я объясню. Вы можете сделать это с помощью AJAX. Этот save_match() создаст запрос с переменной refresh = true или что-то в этом роде. На сервере он установит глобальную переменную everyone_refresh = true, если refresh = true будет отправлено с клиента. Затем, помимо этого, у нас есть еще один запрос AJAX каждую 1 секунду, который будет запрашивать у сервера переменную everyone_refresh. Если он возвращает true, window.location.reload(). Довольно просто. Каждый клиент будет знать, когда обновить. Конечно, есть еще кое-что, что нужно учитывать, например, избегать перекрытий и т. д.   -  person kappaallday    schedule 14.01.2015
comment
Это зависит от платформы, но это собачий путь, быстрый, простой, но не такой элегантный. Теперь есть веб-сокеты для создания непрерывного соединения между клиентом и сервером.   -  person kappaallday    schedule 14.01.2015
comment
@hardcoresquirrel, можешь ответить на это хорошо, чтобы я понял, пожалуйста? :)   -  person gsamaras    schedule 14.01.2015
comment
больше нечего сказать, просто применил на практике, 2 ajax запроса и 2 строчки серверного кода...   -  person kappaallday    schedule 14.01.2015
comment
Давайте продолжим обсуждение в чате.   -  person gsamaras    schedule 14.01.2015


Ответы (1)


Вам необходимо внедрить Server Push. Эта технология имеет различные рабочие стратегии, такие как Long pooling, Heartbeat и WebSockets. Проверь их.

Изменить: это действительно возможно с любой из упомянутых стратегий.

Для длительного объединения вы отправляете запрос на сервер и неопределенно ждете, пока сервер не «оттолкнет» назад любые обновления, если они есть. Проверьте этот пост, чтобы увидеть как это сделать с помощью jQuery.

Heartbeat — это другой и более трудоемкий метод, при котором вы отправляете запрос каждые x секунд, чтобы узнать, есть ли какие-либо обновления с сервера, и если да, вы обновляете свои данные. Проверьте этот пример того, как это реализовать .

Вы также можете увидеть пример реализации javascript-приложения WebSockets в MDN. но обратите внимание на поддержку этой функции браузером, прежде чем использовать ее.

person Roberto Linares    schedule 13.01.2015
comment
Значит, нет? Улучшите свой ответ, потому что теперь он кажется только ссылкой. - person gsamaras; 14.01.2015
comment
Ответ — да, но вы должны выбрать лучшую стратегию для своих нужд. Я отредактировал ответ, чтобы показать более подробную информацию об этом. - person Roberto Linares; 14.01.2015