\n\n```\n\nНюансы:\n- Скрипт `https://vk.com/js/api/videoplayer.js` должен загрузиться до вызова `VK.VideoPlayer` (или вызывать инициализацию в обработчике `onload` этого скрипта). \n- Если видео приватное/требует авторизации — плеер может не инициализироваться. \n- После инициализации объект плеера содержит набор методов и событий (в разных версиях API названия методов могут отличаться) — посмотрите `console.dir(player)` в DevTools, чтобы увидеть доступные API.\n\nПодробнее о привычном VOD‑паттерне — в официальной документации: [VK Developer Documentation](https://dev.vk.com/ru/widgets/video) и примерах сообщества: [qna.habr.com](https://qna.habr.com/q/1302430).\n\n---\n\n## Примеры кода: подписка на события плеера в JavaScript (play/pause/ended) {#player-events}\n\nAPI у разных версий плеера может немного отличаться, потому универсальный приём — сначала инспектировать объект, затем подписаться на доступные методы. Пример «безопасной» подписки, которая проверяет несколько вариантов API:\n\n```javascript\nfunction subscribeEvent(player, evt, handler) {\n if (!player) return;\n if (typeof player.on === 'function') {\n player.on(evt, handler); // часто встречается\n } else if (typeof player.addEventListener === 'function') {\n player.addEventListener(evt, handler);\n } else if (typeof player.bind === 'function') {\n player.bind(evt, handler);\n } else {\n console.warn('No event API found on VK player — will attempt polling', evt);\n }\n}\n\n// Пример использования (после успешной инициализации VK.VideoPlayer)\nsubscribeEvent(player, 'play', () => console.log('play'));\nsubscribeEvent(player, 'pause', () => console.log('pause'));\nsubscribeEvent(player, 'ended', () => console.log('ended'));\nsubscribeEvent(player, 'timeupdate', (t) => console.log('time', t));\n```\n\nЕсли событий нет или API ограничен — используйте fallback: короткий polling (раз в 1–2 с) с проверкой доступных методов у объекта:\n```javascript\n// Polling-safe пример\nlet lastTime = 0;\nconst poll = setInterval(() => {\n if (!player) return;\n if (typeof player.getCurrentTime === 'function') {\n const t = player.getCurrentTime();\n if (t !== lastTime) {\n // проигрывание идёт\n lastTime = t;\n }\n } else if ('currentTime' in player) {\n const t = player.currentTime;\n if (t !== lastTime) lastTime = t;\n } else {\n // нет API - остановить polling или перейти к серверному подходу\n clearInterval(poll);\n }\n}, 1000);\n```\n\nНо помните: доступ к свойствам iframe‑вложенного DOM запрещён из-за CORS — polling тут возможен только если API плеера предоставляет методы (postMessage) или если вы используете свой собственный video элемент (см. HLS ниже).\n\nЕсли вы можете получить прямой поток (MP4/HLS), то лучший и самый надёжный путь — подключить внешний плеер (`hls.js` / `video.js`) и подписываться на стандартные события HTMLMediaElement (`playing`, `pause`, `ended`) — пример ниже в разделе Обходы.\n\n---\n\n## Почему live.vkvideo.ru не распознаётся — ограничения для vk live stream {#live-limitations}\n\nПричины, почему ваш код с `https://live.vkvideo.ru/app/embed/...&js_api=1` не работает:\n\n- другой домен и другой шаблон embed — официальный `VK.VideoPlayer` ожидает `vk.com/video_ext.php` (проверка в коде плеера), поэтому он бросает `iframe src is not a VK embed` (см. [vk.com/js/api/videoplayer.js](https://vk.com/js/api/videoplayer.js)); \n- live‑плеер может реализован совсем иначе (специализированный player на live.vkvideo.ru) и не поддерживает js_api handshake; \n- трансляции по сути «поточные» и окончание трансляции может не отражаться событием `ended` у плеера — платформа может просто перестать выдавать сегменты или показывать оффлайн страницу; обсуждение таких ограничений — на [StackOverflow RU](https://ru.stackoverflow.com/questions/1444459/Управление-vk-видео-через-js) и в описании live‑платформы [live.vkvideo.ru](https://live.vkvideo.ru/). \n\nЧто это значит практично? Нельзя заставить `VK.VideoPlayer` работать с iframe, который он не распознаёт. Нельзя надеяться, что `play`/`ended` будут приходить, если плеер на стороне сервиса не передаёт эти события.\n\n---\n\n## Обходные варианты для отслеживания старта/остановки трансляции (HLS, серверный мониторинг, неофициальные API) {#workarounds}\n\nЕсли нельзя использовать `VK.VideoPlayer` для live.vkvideo.ru — есть рабочие альтернативы. Выбор зависит от доступа к прямым потокам и от требований к надёжности.\n\n1) Подключить прямой HLS (m3u8) к внешнему плееру (рекомендуется, если у вас есть URL m3u8) \n- Используйте hls.js / video.js: вы получите стандартные события медиаплеера. Пример:\n```html\n\n\n\n```\n- Минусы: нужен прямой доступ к manifest (CORS) и стабильный URL.\n\n2) Серверный мониторинг манифеста (надежно для оповещений) \n- Сервер опрашивает HLS manifest (или RTMP ingest/статус) и решает, онлайн ли поток. Затем оповещает клиентов через WebSocket/SSE/webhook. Это обходной, надёжный путь, работает независимо от возможностей embed. Пример Node.js‑логики:\n```javascript\nconst axios = require('axios');\nsetInterval(async () => {\n try {\n const res = await axios.get('https://cdn.example.com/live/stream/playlist.m3u8', { timeout: 5000 });\n const data = res.data;\n const isLive = data.includes('#EXTINF') && !data.includes('#EXT-X-ENDLIST');\n // если состояние изменилось — уведомить клиентов\n } catch (e) {\n // 404/timeout => возможно offline\n }\n}, 15000);\n```\n- Минусы: нужно серверное место, возможны ограничения доступа к CDN (авторизация/CORS).\n\n3) Неформальные/неофициальные API и парсинг страницы \n- Есть проекты в сообществе, которые пытаются получить метаданные трансляций у vkplay.live — например [unofficial-vk-play-live-api](https://github.com/Something-Went-Wrong-ORG/unofficial-vk-play-live-api). Но они нестабильны и могут нарушать правила — используйте с осторожностью. \n- Для быстрых решений иногда парсят страницу трансляции или используют streamlink/CLI (см. обсуждение [streamlink issue](https://github.com/streamlink/streamlink/issues/879)). Минус: ненадёжно и может быть запрещено правилами сервиса.\n\n4) Запросить официальные webhooks / API (если доступны) \n- Иногда платформа предоставляет серверные уведомления о старте/остановке — стоит проверить документацию платформы или обратиться в поддержку.\n\nИтог: если вы не можете получить прямой поток — лучшая схема для надёжности: серверный мониторинг + нотификации клиентам. Если есть прямой m3u8 — используйте hls.js и стандартные события HTMLMediaElement.\n\n---\n\n## Отладка: ошибка \"iframe src is not a VK embed\" — чеклист {#debugging}\n\nБыстрая проверка — пройдите этот чеклист по порядку:\n\n- Проверьте src iframe — он должен быть `https://vk.com/video_ext.php?...&js_api=1`. Если нет — замените на корректный embed (получите код в ВК). \n- Проверьте наличие параметра `js_api=1` в URL — без него скрипт не активирует JS API. \n- Убедитесь, что `` загружен ДО вызова `VK.VideoPlayer` (или инициализация выполняется в onload скрипта/iframe). \n- Подождите загрузки iframe (`iframe.addEventListener('load', ...)`) — инициализируйте внутри обработчика. \n- Посмотрите в консоль: `console.dir(VK)` и `console.dir(player)` — это покажет доступные методы/события. \n- Если видео приватное/под авторизацией — проверьте, виден ли embed в режиме инкогнито. \n- Если нужен мониторинг live — подумайте о серверном опросе manifest (см. выше). \n- Примеры и объяснения ошибок ищите в обсуждениях: [StackOverflow RU](https://ru.stackoverflow.com/questions/1444459/Управление-vk-видео-через-js) и в официальной документации [VK Widgets — Video](https://dev.vk.com/ru/widgets/video).\n\nЕсли после всех проверок проблема остаётся — пришлите точный iframe src (можно без hash) и скрин консоли — помогу с конкретикой.\n\n---\n\n## Источники {#sources}\n\n- [https://dev.vk.com/ru/widgets/video](https://dev.vk.com/ru/widgets/video) \n- [https://vk.com/js/api/videoplayer.js](https://vk.com/js/api/videoplayer.js) \n- [https://ru.stackoverflow.com/questions/1444459/Управление-vk-видео-через-js](https://ru.stackoverflow.com/questions/1444459/Управление-vk-видео-через-js) \n- [https://qna.habr.com/q/1302430](https://qna.habr.com/q/1302430) \n- [https://live.vkvideo.ru/](https://live.vkvideo.ru/) \n- [https://github.com/Something-Went-Wrong-ORG/unofficial-vk-play-live-api](https://github.com/Something-Went-Wrong-ORG/unofficial-vk-play-live-api) \n- [https://github.com/streamlink/streamlink/issues/879](https://github.com/streamlink/streamlink/issues/879) \n- [https://stackoverflow.com/questions/38969996/vk-com-embed-set-start-time-and-hide-controls](https://stackoverflow.com/questions/38969996/vk-com-embed-set-start-time-and-hide-controls)\n\n---\n\n## Заключение {#conclusion}\n\nКоротко: ваш текущий iframe с `live.vkvideo.ru` не совместим с `VK.VideoPlayer` — отсюда ошибка `iframe src is not a VK embed`. Если цель — отслеживать vk события через `VK.VideoPlayer`, используйте `video_ext.php?...&js_api=1` (VOD). Для live‑трансляций надежнее получить прямой поток (HLS) и подключить `hls.js`/`video.js` или реализовать серверный мониторинг manifest (оповещения через WebSocket/SSE). Нужна помощь с конкретной реализацией (например, пример на hls.js + серверный poll для m3u8 или готовый серверный webhook)? Могу подготовить рабочий пример под ваш кейс."},{"@type":"QAPage","@context":"https://schema.org","mainEntity":{"name":"Как получить события от VK.VideoPlayer с помощью JavaScript для отслеживания запуска и остановки трансляций?","text":"Как инициализировать VK.VideoPlayer для iframe с live.vkvideo.ru, подписаться на события play/pause/ended и обойти ошибку 'iframe src is not a VK embed' для трансляций?","@type":"Question","acceptedAnswer":{"text":"VK.VideoPlayer работает только с video_ext.php&js_api=1 (VOD). Для live используйте HLS с hls.js, серверный мониторинг m3u8 или неофициальные API. Примеры кода для событий и отладки.","@type":"Answer","upvoteCount":21,"dateCreated":"2025-11-13T10:50:55.097Z","datePublished":"2025-11-13T10:50:55.097Z","dateModified":"2026-01-10T17:24:13.022Z","author":[{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/about","name":"НейроОтветы","url":"https://xn--b1afbosiaouc3h.xn--p1ai/about","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/logo.png","width":"512","height":"512"}}],"url":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/vk-videoplayer-events-javascript-live-tracking/#message-fba2c5b9-62f8-40c1-8f4e-61320c89896e"},"@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/vk-videoplayer-events-javascript-live-tracking","answerCount":1,"dateCreated":"2025-11-13T10:50:55.097Z","datePublished":"2025-11-13T10:50:55.097Z","dateModified":"2026-01-10T17:24:13.022Z","author":[{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/about","name":"НейроОтветы","url":"https://xn--b1afbosiaouc3h.xn--p1ai/about","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/logo.png","width":"512","height":"512"}}]},"mainEntityOfPage":{"@type":"WebPage","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/vk-videoplayer-events-javascript-live-tracking"},"inLanguage":"ru","dateCreated":"2025-11-13T10:50:55.097Z","datePublished":"2025-11-13T10:50:55.097Z","dateModified":"2026-01-10T17:24:13.022Z","author":[{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/about","name":"НейроОтветы","url":"https://xn--b1afbosiaouc3h.xn--p1ai/about","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/logo.png","width":"512","height":"512"}}],"publisher":{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/about","name":"НейроОтветы","url":"https://xn--b1afbosiaouc3h.xn--p1ai/about","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/logo.png","width":"512","height":"512"}},"@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/vk-videoplayer-events-javascript-live-tracking"},{"@type":"CollectionPage","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/vk-videoplayer-events-javascript-live-tracking/#related-questions","name":"Как получить события VK.VideoPlayer в JavaScript для live","description":"Отслеживание vk события play, pause, ended в VK.VideoPlayer: инициализация iframe с js_api=1, ошибки для live.vkvideo.ru, примеры кода, обходные пути с HLS и мониторингом трансляций.","url":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/vk-videoplayer-events-javascript-live-tracking","inLanguage":"ru","mainEntity":{"@type":"ItemList","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/vk-videoplayer-events-javascript-live-tracking/#related-questions","itemListElement":[{"@type":"ListItem","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/e2ee-vulnerabilities-webapp-ecdh-aes-gcm","name":"Уязвимости E2EE сквозного шифрования в веб-приложениях ECDH AES-GCM","position":1,"item":{"@type":"Article","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/e2ee-vulnerabilities-webapp-ecdh-aes-gcm","mainEntityOfPage":{"@type":"WebPage","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/e2ee-vulnerabilities-webapp-ecdh-aes-gcm"},"inLanguage":"ru","dateCreated":"2025-12-21T10:14:39.137Z","datePublished":"2025-12-21T10:14:39.137Z","dateModified":"2025-12-31T07:07:21.876Z","author":[{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/about","name":"НейроОтветы","url":"https://xn--b1afbosiaouc3h.xn--p1ai/about","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/logo.png","width":"512","height":"512"}}],"publisher":{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/about","name":"НейроОтветы","url":"https://xn--b1afbosiaouc3h.xn--p1ai/about","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/logo.png","width":"512","height":"512"}},"headline":"Уязвимости E2EE сквозного шифрования в веб-приложениях ECDH AES-GCM","description":"Потенциальные уязвимости безопасности при использовании сквозного шифрования E2EE в веб-приложениях с ECDH для обмена ключами и AES-GCM. Анализ кода, угрозы от недоверенного сервера, улучшения для повышения безопасности без компрометации устройства.","keywords":["сквозное шифрование","E2EE","ECDH","AES-GCM","безопасность веб приложений","уязвимости веб-приложений","WebCrypto","end-to-end encryption"],"image":[],"articleBody":""}},{"@type":"ListItem","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/how-to-identify-javascript-libraries-codepen","name":"Определение JavaScript библиотек в CodePen примере","position":2,"item":{"@type":"Article","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/how-to-identify-javascript-libraries-codepen","mainEntityOfPage":{"@type":"WebPage","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/how-to-identify-javascript-libraries-codepen"},"inLanguage":"ru","dateCreated":"2026-01-27T11:38:32.080Z","datePublished":"2026-01-27T11:38:32.080Z","dateModified":"2026-02-10T15:22:07.938Z","author":[{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/about","name":"НейроОтветы","url":"https://xn--b1afbosiaouc3h.xn--p1ai/about","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/logo.png","width":"512","height":"512"}}],"publisher":{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/about","name":"НейроОтветы","url":"https://xn--b1afbosiaouc3h.xn--p1ai/about","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/logo.png","width":"512","height":"512"}},"headline":"Определение JavaScript библиотек в CodePen примере","description":"Как определить JavaScript библиотеки в CodePen примерах, найти их источники и зависимости. Пошаговое руководство для разработчиков.","keywords":["библиотеки javascript","javascript библиотека","codepen javascript","javascript библиотекам и фреймворкам","react библиотеки javascript","javascript jquery библиотека","javascript библиотека python","определить библиотеку javascript","codepen зависимости","javascript библиотеки источники","javascript библиотеки версии","codepen javascript библиотеки","javascript библиотеки анализ"],"image":[],"articleBody":""}},{"@type":"ListItem","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/slick-carousel-image-resizing","name":"Настройка размера изображений в Slick Carousel","position":3,"item":{"@type":"Article","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/slick-carousel-image-resizing","mainEntityOfPage":{"@type":"WebPage","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/slick-carousel-image-resizing"},"inLanguage":"ru","dateCreated":"2026-03-17T07:33:31.598Z","datePublished":"2026-03-17T07:33:31.598Z","dateModified":"2026-03-17T07:33:31.598Z","author":[{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@kenwheeler-github-io","name":"slick","description":"Адаптивный плагин карусели jQuery, поддерживающий несколько точек останова, CSS3-переходы, touch events/swiping и многое другое","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@kenwheeler-github-io","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/api/v1/source/kenwheeler-github-io/logo.png","width":"72","height":"72"}},{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@lauranms","name":"@lauranms","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@lauranms"},{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@it-goldman","name":"@it-goldman","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@it-goldman"},{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@stackoverflow-com","name":"Stack Overflow","description":"Крупнейшая в мире онлайн-сообщество для разработчиков, где профессионалы и энтузиасты обмениваются знаниями о программировании и решении технических проблем","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@stackoverflow-com","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/api/v1/source/stackoverflow-com/logo.png","width":"72","height":"72"}},{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@user27184656","name":"@user27184656","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@user27184656"}],"publisher":{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/about","name":"НейроОтветы","url":"https://xn--b1afbosiaouc3h.xn--p1ai/about","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/logo.png","width":"512","height":"512"}},"headline":"Настройка размера изображений в Slick Carousel","description":"Решение проблемы с изменением размера изображений в Slick Carousel. Настройка CSS и конфигурации для адаптивной карусели.","keywords":["slick carousel","карусель изображений","width 100 height auto","адаптивный карусель","как настроить карусель","изменение размера изображений","css для карусели","настройка slick","адаптивная карусель","изображения в карусели","корректное отображение изображений","динамическое добавление изображений","тестирование карусели"],"image":[],"articleBody":""}},{"@type":"ListItem","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/how-to-close-modal-window-click-outside-or-x","name":"Закрытие модального окна при клике вне области или на X","position":4,"item":{"@type":"Article","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/how-to-close-modal-window-click-outside-or-x","mainEntityOfPage":{"@type":"WebPage","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/how-to-close-modal-window-click-outside-or-x"},"inLanguage":"ru","dateCreated":"2026-05-27T16:22:17.597Z","datePublished":"2026-05-27T16:22:17.597Z","dateModified":"2026-05-27T16:22:17.597Z","author":[{"@type":"Person","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@hagai-harari","name":"Hagai Harari","givenName":"Hagai","familyName":"Harari","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@hagai-harari","jobTitle":"Разработчик","description":"Активный пользователь Stack Overflow с высокой репутацией (2,867), специализирующийся на React, JavaScript, React Native и Redux. Имеет 214 ответов и 17 вопросов."},{"@type":"Person","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@strdr4605","name":"strdr4605","givenName":"strdr4605","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@strdr4605","jobTitle":"Разработчик","description":"Активный пользователь Stack Overflow с репутацией 4,462, специализирующийся на TypeScript, React, React Native и JavaScript. Участвует в нескольких сообществах Stack Exchange, включая Ask Different, Ask Ubuntu и Meta Stack Exchange."}],"publisher":{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/about","name":"НейроОтветы","url":"https://xn--b1afbosiaouc3h.xn--p1ai/about","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/logo.png","width":"512","height":"512"}},"headline":"Закрытие модального окна при клике вне области или на X","description":"Пошаговое руководство по реализации закрытия модального окна при клике вне области или на кнопке X. Примеры кода на JavaScript.","keywords":["модальное окно","закрыть модальное окно","модальное окно js","javascript модального окна","модальное окно при клике","кнопка закрыть модальное окно","закрытие модального окна","модальное окно html css js","модальное окно поверх модального окна","модальное окно с выбором","модальное окно подтверждения","модальное окно с сообщением"],"image":[],"articleBody":""}},{"@type":"ListItem","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/javascript-button-not-displaying-dom","name":"Почему кнопка JavaScript не отображается на странице","position":5,"item":{"@type":"Article","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/javascript-button-not-displaying-dom","mainEntityOfPage":{"@type":"WebPage","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/javascript-button-not-displaying-dom"},"inLanguage":"ru","dateCreated":"2026-04-14T11:32:27.942Z","datePublished":"2026-04-14T11:32:27.942Z","dateModified":"2026-04-14T11:32:27.942Z","author":[{"@type":"Person","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@mdn-contributors","name":"MDN contributors","givenName":"MDN","familyName":"contributors","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@mdn-contributors","image":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/api/v1/person/mdn-contributors/avatar.png","width":"72","height":"72"},"jobTitle":"Разработчики","description":"Глобальное сообщество волонтеров и партнеров, вносящих вклад в документацию MDN Web Docs."},{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@developer-mozilla-org","name":"MDN Web Docs","description":"Открытый совместный проект, предоставляющий информацию об открытых веб-технологиях, включая HTML, CSS и API для веб-сайтов.","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@developer-mozilla-org","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/api/v1/source/developer-mozilla-org/logo.png","width":"72","height":"72"}}],"publisher":{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/about","name":"НейроОтветы","url":"https://xn--b1afbosiaouc3h.xn--p1ai/about","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/logo.png","width":"512","height":"512"}},"headline":"Почему кнопка JavaScript не отображается на странице","description":"Решение проблемы с отображением кнопок, созданных через document.createElement(). Узнайте о правильном времени выполнения кода и добавлении элементов в DOM.","keywords":["document createelement button","javascript кнопка","javascript createelement appendchild","appendchild javascript","javascript добавить кнопки","appendchild script","javascript загрузка страницы"],"image":["https://xn--b1afbosiaouc3h.xn--p1ai/api/v1/question/17062/preview/1x1.png","https://xn--b1afbosiaouc3h.xn--p1ai/api/v1/question/17062/preview/4x3.png","https://xn--b1afbosiaouc3h.xn--p1ai/api/v1/question/17062/preview/16x9.png"],"articleBody":""}},{"@type":"ListItem","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/prevent-duplicate-tilda-form-submissions","name":"Tilda формы: запрет повторной отправки с JS","position":6,"item":{"@type":"Article","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/prevent-duplicate-tilda-form-submissions","mainEntityOfPage":{"@type":"WebPage","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/prevent-duplicate-tilda-form-submissions"},"inLanguage":"ru","dateCreated":"2025-11-07T10:54:47.023Z","datePublished":"2025-11-07T10:54:47.023Z","dateModified":"2026-01-12T07:47:41.552Z","author":[{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/about","name":"НейроОтветы","url":"https://xn--b1afbosiaouc3h.xn--p1ai/about","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/logo.png","width":"512","height":"512"}}],"publisher":{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/about","name":"НейроОтветы","url":"https://xn--b1afbosiaouc3h.xn--p1ai/about","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/logo.png","width":"512","height":"512"}},"headline":"Tilda формы: запрет повторной отправки с JS","description":"Настройка формы Tilda для запрета дубликатов: используйте localStorage и MutationObserver. Пошаговый гайд по добавлению JS в блок T123, отслеживанию успеха отправки без ID и показу сообщения при повторном клике. Идеально для форм заявок и всплывающих модалок.","keywords":["tilda формы","tilda формы обратной связи","форма заявки tilda","настройка формы tilda","форма tilda zero block","tilda javascript форма"],"image":[],"articleBody":""}},{"@type":"ListItem","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/smooth-background-change-on-scroll-javascript","name":"Плавная смена фона при скролле в JavaScript без резких переходов","position":7,"item":{"@type":"Article","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/smooth-background-change-on-scroll-javascript","mainEntityOfPage":{"@type":"WebPage","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/smooth-background-change-on-scroll-javascript"},"inLanguage":"ru","dateCreated":"2026-01-02T13:45:04.795Z","datePublished":"2026-01-02T13:45:04.795Z","dateModified":"2026-01-02T13:45:04.795Z","author":[{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/about","name":"НейроОтветы","url":"https://xn--b1afbosiaouc3h.xn--p1ai/about","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/logo.png","width":"512","height":"512"}}],"publisher":{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/about","name":"НейроОтветы","url":"https://xn--b1afbosiaouc3h.xn--p1ai/about","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/logo.png","width":"512","height":"512"}},"headline":"Плавная смена фона при скролле в JavaScript без резких переходов","description":"Как сделать плавную анимацию смены статичного фонового изображения при скролле: используйте слои с opacity, CSS transitions, Vanilla JS с requestAnimationFrame или GSAP ScrollTrigger. Примеры кода для fade-эффекта без лагов.","keywords":["плавная смена фона","анимация при скролле","смена фона при скролле","GSAP ScrollTrigger","css opacity transition","javascript scroll","анимация фона","плавный скролл","смена backgroundImage","IntersectionObserver"],"image":[],"articleBody":""}},{"@type":"ListItem","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/how-to-disable-chrome-autocomplete-forms","name":"Как отключить автозаполнение Chrome в формах","position":8,"item":{"@type":"Article","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/how-to-disable-chrome-autocomplete-forms","mainEntityOfPage":{"@type":"WebPage","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/how-to-disable-chrome-autocomplete-forms"},"inLanguage":"ru","dateCreated":"2026-02-25T11:32:58.435Z","datePublished":"2026-02-25T11:32:58.435Z","dateModified":"2026-02-25T11:32:58.435Z","author":[{"@type":"Person","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@aleksii-kodov","name":"Алексей Кодов","givenName":"Алексей","familyName":"Кодов","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@aleksii-kodov","jobTitle":"Технический писатель","description":"Технический писатель, специализирующийся на веб-разработке и создании обучающих материалов для IT-профессий"},{"@type":"Person","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@kemal-demirel","name":"Кемал Демирель","givenName":"Кемал","familyName":"Демирель","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@kemal-demirel","jobTitle":"Пользователь/Разработчик","description":"Участник сообщества Stack Overflow на русском, задающий вопросы по веб-разработке и автозаполнению форм"},{"@type":"Person","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@7-zete-7","name":"7-zete-7","givenName":"7-zete-7","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@7-zete-7","jobTitle":"Разработчик","description":"Пользователь Stack Overflow"},{"@type":"Person","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@mdn-contributors","name":"MDN contributors","givenName":"MDN","familyName":"contributors","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@mdn-contributors","image":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/api/v1/person/mdn-contributors/avatar.png","width":"72","height":"72"},"jobTitle":"Разработчики","description":"Глобальное сообщество волонтеров и партнеров, вносящих вклад в документацию MDN Web Docs."},{"@type":"Person","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@a-r-t-u-r","name":"@a-r-t-u-r","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@a-r-t-u-r","image":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/api/v1/person/a-r-t-u-r/avatar.png","width":"72","height":"72"},"jobTitle":"Разработчик","description":"PHP, JavaScript, HTML5, CSS разработчик, активный участник Хабр Q&A с опытом в веб-разработке"},{"@type":"Person","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@aleksei-ukolov","name":"Алексей Уколов","givenName":"Алексей","familyName":"Уколов","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@aleksei-ukolov","jobTitle":"Куратор тега JavaScript","description":"Куратор тега JavaScript на Хабр Q&A, эксперт в области веб-разработки"},{"@type":"Person","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@smyslov-d","name":"@smyslov-d","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@smyslov-d","jobTitle":"Разработчик","description":"Разработчик, участник Хабр Q&A, специализирующийся на веб-технологиях"},{"@type":"Person","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@dmitry-bashlak","name":"Dmitry Bashlak","givenName":"Dmitry","familyName":"Bashlak","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@dmitry-bashlak","jobTitle":"Основатель и автор","description":"Основатель сайта remontka.pro, автор обучающих материалов по работе с компьютерами и программным обеспечением"}],"publisher":{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/about","name":"НейроОтветы","url":"https://xn--b1afbosiaouc3h.xn--p1ai/about","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/logo.png","width":"512","height":"512"}},"headline":"Как отключить автозаполнение Chrome в формах","description":"Пошаговые решения для отключения автозаполнения Chrome в формах, когда autocomplete='off' не работает. Эффективные методы для предотвращения неправильного автозаполнения полей.","keywords":["автозаполнение chrome","отключить автозаполнение chrome","автозаполнение полей формы","автозаполнение пароля chrome","chrome браузер автозаполнение","автозаполнение google chrome","данные автозаполнения chrome","android автозаполнение форм по полям в приложении","chrome autocomplete off","autocomplete off не работает"],"image":[],"articleBody":""}},{"@type":"ListItem","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/how-to-capitalize-first-letter-javascript","name":"Как сделать первую букву строки заглавной в JavaScript","position":9,"item":{"@type":"Article","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/how-to-capitalize-first-letter-javascript","mainEntityOfPage":{"@type":"WebPage","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/how-to-capitalize-first-letter-javascript"},"inLanguage":"ru","dateCreated":"2025-10-20T16:05:01.914Z","datePublished":"2025-10-20T16:05:01.914Z","dateModified":"2026-01-15T10:41:21.407Z","author":[{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/about","name":"НейроОтветы","url":"https://xn--b1afbosiaouc3h.xn--p1ai/about","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/logo.png","width":"512","height":"512"}}],"publisher":{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/about","name":"НейроОтветы","url":"https://xn--b1afbosiaouc3h.xn--p1ai/about","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/logo.png","width":"512","height":"512"}},"headline":"Как сделать первую букву строки заглавной в JavaScript","description":"Простой способ в JS сделать первую букву строки заглавной, не меняя регистр остальных символов. Примеры кода с проверкой на букву, Unicode-поддержка для кириллицы и путей вроде \"/index.html\". Эффективные методы charAt, slice и regex.","keywords":["сделать первую букву заглавной","javascript строка","первая буква заглавная","js первая буква заглавная","заглавная буква javascript","capitalize first letter js","первый символ строки javascript","работа со строками javascript"],"image":[],"articleBody":""}},{"@type":"ListItem","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/why-required-attribute-not-working-html-forms","name":"Почему атрибут required не работает в HTML формах и как это исправить","position":10,"item":{"@type":"Article","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/why-required-attribute-not-working-html-forms","mainEntityOfPage":{"@type":"WebPage","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/c/web/q/why-required-attribute-not-working-html-forms"},"inLanguage":"ru","dateCreated":"2026-05-03T09:12:54.168Z","datePublished":"2026-05-03T09:12:54.168Z","dateModified":"2026-05-03T10:38:42.200Z","author":[{"@type":"Person","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/@mdn-contributors","name":"MDN contributors","givenName":"MDN","familyName":"contributors","url":"https://xn--b1afbosiaouc3h.xn--p1ai/@mdn-contributors","image":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/api/v1/person/mdn-contributors/avatar.png","width":"72","height":"72"},"jobTitle":"Разработчики","description":"Глобальное сообщество волонтеров и партнеров, вносящих вклад в документацию MDN Web Docs."}],"publisher":{"@type":"Organization","@id":"https://xn--b1afbosiaouc3h.xn--p1ai/about","name":"НейроОтветы","url":"https://xn--b1afbosiaouc3h.xn--p1ai/about","logo":{"@type":"ImageObject","url":"https://xn--b1afbosiaouc3h.xn--p1ai/logo.png","width":"512","height":"512"}},"headline":"Почему атрибут required не работает в HTML формах и как это исправить","description":"Объяснение, почему атрибут required не работает при использовании preventDefault() и как правильно реализовать валидацию форм с JavaScript.","keywords":["обязательное поле","ошибка валидации","формы html","input required","валидация формы","javascript форма","preventdefault","атрибут required","валидация javascript","html форма javascript","отправка форм javascript","событие формы javascript","javascript элементы формы","работа с формами javascript"],"image":["https://xn--b1afbosiaouc3h.xn--p1ai/api/v1/question/17522/preview/1x1.png","https://xn--b1afbosiaouc3h.xn--p1ai/api/v1/question/17522/preview/4x3.png","https://xn--b1afbosiaouc3h.xn--p1ai/api/v1/question/17522/preview/16x9.png"],"articleBody":""}}]}}]}
Веб

Как получить события VK.VideoPlayer в JavaScript для live

Отслеживание vk события play, pause, ended в VK.VideoPlayer: инициализация iframe с js_api=1, ошибки для live.vkvideo.ru, примеры кода, обходные пути с HLS и мониторингом трансляций.

1 ответ 21 просмотр

Как получить события от VK.VideoPlayer с помощью JavaScript для отслеживания запуска и остановки трансляций?

Я пытаюсь отследить события запуска и остановки трансляции во встроенном плеере VK, но столкнулся с проблемами при инициализации. Использую следующий код:

html
<iframe
 id="strm"
 src="https://live.vkvideo.ru/app/embed/kotik?autoplay=true&js_api=1"
 allow="autoplay;encrypted-media;fullscreen;picture-in-picture"
 allowfullscreen>
</iframe>
<script src="https://vk.com/js/api/videoplayer.js"></script>

При попытке инициализации плеера:

javascript
const player = VK.VideoPlayer("strm");
// или
const player = VK.VideoPlayer(document.querySelector("#strm"));

Получаю ошибку: Uncaught Error: iframe src is not a VK embed

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

Ошибка Uncaught Error: iframe src is not a VK embed возникает потому, что VK.VideoPlayer распознаёт только официальные встраиваемые URL (например, video_ext.php?...&js_api=1), а https://live.vkvideo.ru/... — другой хост и другой шаблон embed. Для VOD (video_ext.php) можно инициализировать VK.VideoPlayer и подписаться на vk события (play, pause, ended, timeupdate) через vk api javascript; для live‑трансляций на live.vkvideo.ru официальной поддержки событий нет — придётся использовать обходные пути: прямой HLS + внешний плеер (hls.js/video.js), серверный мониторинг манифеста или неофициальные API (с риском и ограничениями).


Содержание


VK.VideoPlayer и vk события — почему ваш код падает

Коротко: скрипт https://vk.com/js/api/videoplayer.js проверяет src iframe и допускает только поддерживаемые шаблоны embed (обычно https://vk.com/video_ext.php?...&js_api=1). Если iframe ссылается на другой домен или другой формат (например, https://live.vkvideo.ru/...), инициализация бросит iframe src is not a VK embed. Это подтверждается в официальной документации и исходнике плеера — см. VK Developer Documentation и сам скрипт https://vk.com/js/api/videoplayer.js.

Почему это важно? Потому что для управления и получения событий плеер и API должны договориться по протоколу (обычно через postMessage). Если рукопожатия нет — нет и событий. На практике для VOD‑встраивания (video_ext.php) это работает: можно создать экземпляр VK.VideoPlayer(iframe) и получить методы/события. Но для трансляций на отдельной платформе — часто другой плеер, другие правила, и события ended и т.п. могут отсутствовать или никогда не вызываться (видео считается «вечным»). См. практические обсуждения на StackOverflow на русском.


Корректное встраивание VOD (video_ext.php + js_api=1)

Если задача — отслеживать события через VK.VideoPlayer, используйте официальную встраиваемую ссылку вида https://vk.com/video_ext.php?...&js_api=1. Обычно её можно получить через кнопку “Embed” в публикации ВК или из HTML кода поста.

Пример минимальной разметки для VOD:

html
<iframe
 id="vkPlayer"
 src="https://vk.com/video_ext.php?oid=-12345&id=67890&hash=...&js_api=1"
 allow="autoplay;encrypted-media;fullscreen;picture-in-picture"
 allowfullscreen>
</iframe>

<script src="https://vk.com/js/api/videoplayer.js"></script>
<script>
document.getElementById('vkPlayer').addEventListener('load', () => {
 try {
 const player = VK.VideoPlayer(document.getElementById('vkPlayer'));
 console.log('VK player ready:', player);
 // далее — подписка на события (см. далее)
 } catch (err) {
 console.error(err.message);
 }
});
</script>

Нюансы:

  • Скрипт https://vk.com/js/api/videoplayer.js должен загрузиться до вызова VK.VideoPlayer (или вызывать инициализацию в обработчике onload этого скрипта).
  • Если видео приватное/требует авторизации — плеер может не инициализироваться.
  • После инициализации объект плеера содержит набор методов и событий (в разных версиях API названия методов могут отличаться) — посмотрите console.dir(player) в DevTools, чтобы увидеть доступные API.

Подробнее о привычном VOD‑паттерне — в официальной документации: VK Developer Documentation и примерах сообщества: qna.habr.com.


Примеры кода: подписка на события плеера в JavaScript (play/pause/ended)

API у разных версий плеера может немного отличаться, потому универсальный приём — сначала инспектировать объект, затем подписаться на доступные методы. Пример «безопасной» подписки, которая проверяет несколько вариантов API:

javascript
function subscribeEvent(player, evt, handler) {
 if (!player) return;
 if (typeof player.on === 'function') {
 player.on(evt, handler); // часто встречается
 } else if (typeof player.addEventListener === 'function') {
 player.addEventListener(evt, handler);
 } else if (typeof player.bind === 'function') {
 player.bind(evt, handler);
 } else {
 console.warn('No event API found on VK player — will attempt polling', evt);
 }
}

// Пример использования (после успешной инициализации VK.VideoPlayer)
subscribeEvent(player, 'play', () => console.log('play'));
subscribeEvent(player, 'pause', () => console.log('pause'));
subscribeEvent(player, 'ended', () => console.log('ended'));
subscribeEvent(player, 'timeupdate', (t) => console.log('time', t));

Если событий нет или API ограничен — используйте fallback: короткий polling (раз в 1–2 с) с проверкой доступных методов у объекта:

javascript
// Polling-safe пример
let lastTime = 0;
const poll = setInterval(() => {
 if (!player) return;
 if (typeof player.getCurrentTime === 'function') {
 const t = player.getCurrentTime();
 if (t !== lastTime) {
 // проигрывание идёт
 lastTime = t;
 }
 } else if ('currentTime' in player) {
 const t = player.currentTime;
 if (t !== lastTime) lastTime = t;
 } else {
 // нет API - остановить polling или перейти к серверному подходу
 clearInterval(poll);
 }
}, 1000);

Но помните: доступ к свойствам iframe‑вложенного DOM запрещён из-за CORS — polling тут возможен только если API плеера предоставляет методы (postMessage) или если вы используете свой собственный video элемент (см. HLS ниже).

Если вы можете получить прямой поток (MP4/HLS), то лучший и самый надёжный путь — подключить внешний плеер (hls.js / video.js) и подписываться на стандартные события HTMLMediaElement (playing, pause, ended) — пример ниже в разделе Обходы.


Почему live.vkvideo.ru не распознаётся — ограничения для vk live stream

Причины, почему ваш код с https://live.vkvideo.ru/app/embed/...&js_api=1 не работает:

  • другой домен и другой шаблон embed — официальный VK.VideoPlayer ожидает vk.com/video_ext.php (проверка в коде плеера), поэтому он бросает iframe src is not a VK embed (см. vk.com/js/api/videoplayer.js);
  • live‑плеер может реализован совсем иначе (специализированный player на live.vkvideo.ru) и не поддерживает js_api handshake;
  • трансляции по сути «поточные» и окончание трансляции может не отражаться событием ended у плеера — платформа может просто перестать выдавать сегменты или показывать оффлайн страницу; обсуждение таких ограничений — на StackOverflow RU и в описании live‑платформы live.vkvideo.ru.

Что это значит практично? Нельзя заставить VK.VideoPlayer работать с iframe, который он не распознаёт. Нельзя надеяться, что play/ended будут приходить, если плеер на стороне сервиса не передаёт эти события.


Обходные варианты для отслеживания старта/остановки трансляции (HLS, серверный мониторинг, неофициальные API)

Если нельзя использовать VK.VideoPlayer для live.vkvideo.ru — есть рабочие альтернативы. Выбор зависит от доступа к прямым потокам и от требований к надёжности.

  1. Подключить прямой HLS (m3u8) к внешнему плееру (рекомендуется, если у вас есть URL m3u8)
  • Используйте hls.js / video.js: вы получите стандартные события медиаплеера. Пример:
html
<video id="hlsPlayer" controls></video>
<script src="https://cdn.jsdelivr.net/npm/hls.js@latest"></script>
<script>
const video = document.getElementById('hlsPlayer');
const url = 'https://cdn.example.com/live/stream/playlist.m3u8'; // ваш HLS manifest
if (Hls.isSupported()) {
 const hls = new Hls();
 hls.loadSource(url);
 hls.attachMedia(video);
 video.addEventListener('playing', () => console.log('stream playing'));
 video.addEventListener('pause', () => console.log('paused'));
 video.addEventListener('ended', () => console.log('ended'));
} else {
 video.src = url; // нативный HLS в Safari
}
</script>
  • Минусы: нужен прямой доступ к manifest (CORS) и стабильный URL.
  1. Серверный мониторинг манифеста (надежно для оповещений)
  • Сервер опрашивает HLS manifest (или RTMP ingest/статус) и решает, онлайн ли поток. Затем оповещает клиентов через WebSocket/SSE/webhook. Это обходной, надёжный путь, работает независимо от возможностей embed. Пример Node.js‑логики:
javascript
const axios = require('axios');
setInterval(async () => {
 try {
 const res = await axios.get('https://cdn.example.com/live/stream/playlist.m3u8', { timeout: 5000 });
 const data = res.data;
 const isLive = data.includes('#EXTINF') && !data.includes('#EXT-X-ENDLIST');
 // если состояние изменилось — уведомить клиентов
 } catch (e) {
 // 404/timeout => возможно offline
 }
}, 15000);
  • Минусы: нужно серверное место, возможны ограничения доступа к CDN (авторизация/CORS).
  1. Неформальные/неофициальные API и парсинг страницы
  • Есть проекты в сообществе, которые пытаются получить метаданные трансляций у vkplay.live — например unofficial-vk-play-live-api. Но они нестабильны и могут нарушать правила — используйте с осторожностью.
  • Для быстрых решений иногда парсят страницу трансляции или используют streamlink/CLI (см. обсуждение streamlink issue). Минус: ненадёжно и может быть запрещено правилами сервиса.
  1. Запросить официальные webhooks / API (если доступны)
  • Иногда платформа предоставляет серверные уведомления о старте/остановке — стоит проверить документацию платформы или обратиться в поддержку.

Итог: если вы не можете получить прямой поток — лучшая схема для надёжности: серверный мониторинг + нотификации клиентам. Если есть прямой m3u8 — используйте hls.js и стандартные события HTMLMediaElement.


Отладка: ошибка “iframe src is not a VK embed” — чеклист

Быстрая проверка — пройдите этот чеклист по порядку:

  • Проверьте src iframe — он должен быть https://vk.com/video_ext.php?...&js_api=1. Если нет — замените на корректный embed (получите код в ВК).
  • Проверьте наличие параметра js_api=1 в URL — без него скрипт не активирует JS API.
  • Убедитесь, что <script src="https://vk.com/js/api/videoplayer.js"></script> загружен ДО вызова VK.VideoPlayer (или инициализация выполняется в onload скрипта/iframe).
  • Подождите загрузки iframe (iframe.addEventListener('load', ...)) — инициализируйте внутри обработчика.
  • Посмотрите в консоль: console.dir(VK) и console.dir(player) — это покажет доступные методы/события.
  • Если видео приватное/под авторизацией — проверьте, виден ли embed в режиме инкогнито.
  • Если нужен мониторинг live — подумайте о серверном опросе manifest (см. выше).
  • Примеры и объяснения ошибок ищите в обсуждениях: StackOverflow RU и в официальной документации VK Widgets — Video.

Если после всех проверок проблема остаётся — пришлите точный iframe src (можно без hash) и скрин консоли — помогу с конкретикой.


Источники


Заключение

Коротко: ваш текущий iframe с live.vkvideo.ru не совместим с VK.VideoPlayer — отсюда ошибка iframe src is not a VK embed. Если цель — отслеживать vk события через VK.VideoPlayer, используйте video_ext.php?...&js_api=1 (VOD). Для live‑трансляций надежнее получить прямой поток (HLS) и подключить hls.js/video.js или реализовать серверный мониторинг manifest (оповещения через WebSocket/SSE). Нужна помощь с конкретной реализацией (например, пример на hls.js + серверный poll для m3u8 или готовый серверный webhook)? Могу подготовить рабочий пример под ваш кейс.

Авторы
Проверено модерацией
НейроОтветы
Модерация
Как получить события VK.VideoPlayer в JavaScript для live