Проблема

Пока эта проблема не будет решена, Zoom Web Client SDK не покинет комнату, когда участник, случайно или намеренно, закроет вкладку. Zoom утверждает, что безответственный участник будет удален (а не исключен) из собрания примерно через 30 секунд, но, по моим наблюдениям, он все еще будет там в течение нескольких минут, как утверждают другие.

Это приводит к проблеме, когда участник закрывает вкладку, но все еще находится на собрании, и повторно входит в собрание. Большое дело. Всего 1 дубликат пользователя, один из которых завис. Но тогда каковы шансы, что человек, который случайно закрыл вкладку масштабирования, не сделает этого снова? Что, если это происходит из-за проблемы с сетью? А если человек делает это намеренно? Скоро встреча будет заполнена десятками зависающих экранов.

Популярный, но разочаровывающий способ

Многие, в том числе и я, похоже, в первую очередь сосредоточились на событии «закрытия» окна, то есть beforeunload . Это выглядит так:

window.addEventListener("beforeunload", function() {
  ZoomMtg.leaveMeeting()
})

Но это beforeunload событие довольно сложное с такими вещами, как «вы return null в этих браузерах и event.returnValue = null в этих других браузерах» и тому подобное. Фу.

При всех заморочках все равно не просто стабильно было, наверное из-за того что beforeunload не для тебя много чего делать; не говоря уже о блокировании таких вещей, как синхронизированный вызов ajax.

Правильный путь

Этот ответ StackOverflow включает в себя две вещи:

  1. visibilityChange событие document
  2. 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? и т.д.)

То, как я реализовал это в своем проекте, я не смог протестировать для
- кнопка закрытия вкладки
- закрытие вкладки с помощью встроенной команды
, но я предполагаю, что это должно работать.