Проблема
Пока эта проблема не будет решена, Zoom Web Client SDK не покинет комнату, когда участник, случайно или намеренно, закроет вкладку. Zoom утверждает, что безответственный участник будет удален (а не исключен) из собрания примерно через 30 секунд, но, по моим наблюдениям, он все еще будет там в течение нескольких минут, как утверждают другие.
Это приводит к проблеме, когда участник закрывает вкладку, но все еще находится на собрании, и повторно входит в собрание. Большое дело. Всего 1 дубликат пользователя, один из которых завис. Но тогда каковы шансы, что человек, который случайно закрыл вкладку масштабирования, не сделает этого снова? Что, если это происходит из-за проблемы с сетью? А если человек делает это намеренно? Скоро встреча будет заполнена десятками зависающих экранов.
Популярный, но разочаровывающий способ
Многие, в том числе и я, похоже, в первую очередь сосредоточились на событии «закрытия» окна, то есть beforeunload
. Это выглядит так:
window.addEventListener("beforeunload", function() { ZoomMtg.leaveMeeting() })
Но это beforeunload
событие довольно сложное с такими вещами, как «вы return null
в этих браузерах и event.returnValue = null
в этих других браузерах» и тому подобное. Фу.
При всех заморочках все равно не просто стабильно было, наверное из-за того что beforeunload
не для тебя много чего делать; не говоря уже о блокировании таких вещей, как синхронизированный вызов ajax.
Правильный путь
Этот ответ StackOverflow включает в себя две вещи:
visibilityChange
событиеdocument
sendBeacon()
sendBeacon()
похож на подлый ajax, который, по-видимому, живет после того, как страница исчезла. Было бы идеально, если бы Zoom API предлагал такую конечную точку для имитации «ухода», но это не так.
Я попробовал за visibilityChange
просто ради интереса, и да. Это намного стабильнее, чем beforeunload
! Я предположил, что, поскольку он находится на верхнем уровне ( beforeunload
— это самый край разборки страницы, а visibilityChange
— это просто «внешний вид»?), у него будет больше возможностей для работы.
из MDN (выделено мной)
Это событие запускается с
visibilityState
изhidden
, когда пользователь переходит на новую страницу, переключает вкладки, закрывает вкладку, сворачивает или закрывает браузер или на мобильном устройстве переключается с браузера на другое приложение. Переход кhidden
– это последнее событие, достоверно наблюдаемое страницей, поэтому разработчикам следует рассматривать его как вероятное завершение сеанса пользователя (например, для отправки данных аналитики).
На первый взгляд это похоже на место, предназначенное для разбивки лагеря для уборки.
Ниже приведен пример моего кода.
function setLeaveListener(doc, zoom) { doc.addEventListener("visibilitychange", function() { if (doc.visibilityState === 'hidden') { zoom.leaveMeeting() } }); } setLeaveListener(document, ZoomMtg) // invoke it when `document` is available
Это вручную проверено на работоспособность для:
- кнопки «Выйти» (конечно)
- кнопки закрытия браузера
- закрытия браузера собственной командой (Cmd+w на osx, Ctrl+w на Windows? и т.д.)
То, как я реализовал это в своем проекте, я не смог протестировать для
- кнопка закрытия вкладки
- закрытие вкладки с помощью встроенной команды
, но я предполагаю, что это должно работать.