@Abcdefgk

Нет события beforeunload — есть какое-то объяснение?

Столкнулся с такой странностью.
Простая на клиенте вещь, вот такие две строчки:
window.addEventListener('beforeunload', function() {
  sendMessage(room);
});

Содержание функции простое, можно было так написать - socket.emit('message', room)
Решил опробовать WebRTC, а мне обязательно нужно на сервере считать количество клиентов в "комнатах", для чего есть объектик, в котором имя комнаты - ключ, и его значение - массив со случайными id присоединившихся к ней. Предполагается, что если клиент уходит (закрывает окно), то и нужно отправить имя комнаты, из которой он ушел, чтобы отнять элемент из соответствующего массива.

Я всё это дело сделал дома, и на localhost это всё нормально работает. Решил попробовать, так сказать, "в эфире" - выпросил 14 дней бесплатного VPS, залил туда всё, запустил... ... - а нет этого события, месадж не отправляется, сервер ничего не получает при закрытии окна. Количество присоединившихся к комнатам в массивы плюсуется, а при уходе - не уменьшается, естественно.

Повторю: на localhost всё работает. Я уже и в пяти вариациях это писал, и во всех на локалхосте работает, а ровно то же самое в энторнетах - нет события, нет сообщения, сервер ничего не получает.
Есть этому хоть какое-то объяснение?
  • Вопрос задан
  • 479 просмотров
Пригласить эксперта
Ответы на вопрос 3
carlcox
@carlcox
Fullstack developer
window.onbeforeunload = function() {
  return sendMessage(room);
};
?
Ответ написан
@Abcdefgk Автор вопроса
Короче, если кому интересно, то я всё сделал иначе, и оно работает, вроде.
Я сам себе придумал проблему, когда для подсчёта клиентов стал записывать в массивы комнат случайные типа-айдишники.
Тогда как каждое socket-соединение имеет собственный уникальный id - их-то, уникальные id, и надо в эти массивы складывать. И тогда я могу обойтись без имени комнаты, из которой клиент ушёл.
При событии socket.on('disconnect', ... (а оно неизбежно, как смерть и налоги) мы легко можем зафиксировать, какой сокет отключился, - по его этому самому id. Остаётся только перебрать весь объект-хранилище и удалить этот конкретный элемент. Ну вот так:
socket.on('disconnect', function() {
	for(var key in clientsArray) {
		for(var i=0; i<clientsArray[key].length; i++) {
			if(clientsArray[key][i] == socket.id) {
				clientsArray[key].splice(i, 1);
			}
		}
	}
});

Вуаля.
Правда, с событием beforeunload непонятка так и осталась.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы