\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":""}}]}}]}