PluginProbe
Elementor Website Builder – more than just a page builder / 3.32.0
Elementor Website Builder – more than just a page builder v3.32.0
4.3.0-beta2 4.3.0-beta1 4.2.4 4.2.3 4.2.2 4.2.1 4.2.0 4.1.5 4.2.0-beta2 4.2.0-dev2 4.2.0-beta1 4.1.4 4.1.3 4.1.2 4.1.1 4.1.0 4.1.0-beta3 4.1.0-dev3 4.0.9 4.1.0-beta2 4.1.0-dev2 4.0.8 4.1.0-beta1 4.1.0-dev1 4.0.7 All 451 releases
elementor / assets / js / youtube-handler.js

youtube-handler.js in Elementor Website Builder – more than just a page builder 3.32.0, at assets/js/youtube-handler.js

141 lines 4.8 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 /*! elementor - v3.32.0 - 15-09-2025 */
2 "use strict";
3 (self["webpackChunkelementorFrontend"] = self["webpackChunkelementorFrontend"] || []).push([["youtube-handler"],{
4
5 /***/ "../modules/atomic-widgets/elements/atomic-youtube/youtube-handler.js":
6 /*!****************************************************************************!*\
7 !*** ../modules/atomic-widgets/elements/atomic-youtube/youtube-handler.js ***!
8 \****************************************************************************/
9 /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {
10
11
12
13 var _frontendHandlers = __webpack_require__(/*! @elementor/frontend-handlers */ "@elementor/frontend-handlers");
14 const getYoutubeVideoIdFromUrl = url => {
15 const regex = /^(?:https?:\/\/)?(?:www\.)?(?:m\.)?(?:youtu\.be\/|youtube\.com\/(?:(?:watch)?\?(?:.*&)?vi?=|(?:embed|v|vi|user|shorts)\/))([^?&"'>]+)/;
16 const match = url.match(regex);
17 return match ? match[1] : null;
18 };
19 const loadYouTubeAPI = () => {
20 return new Promise(resolve => {
21 if (window.YT && window.YT.loaded) {
22 resolve(window.YT);
23 return;
24 }
25 const YOUTUBE_IFRAME_API_URL = 'https://www.youtube.com/iframe_api';
26 if (!document.querySelector(`script[src="${YOUTUBE_IFRAME_API_URL}"]`)) {
27 const tag = document.createElement('script');
28 tag.src = YOUTUBE_IFRAME_API_URL;
29 const firstScriptTag = document.getElementsByTagName('script')[0];
30 firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
31 }
32 const checkYT = () => {
33 if (window.YT && window.YT.loaded) {
34 resolve(window.YT);
35 } else {
36 setTimeout(checkYT, 350);
37 }
38 };
39 checkYT();
40 });
41 };
42 (0, _frontendHandlers.register)({
43 elementType: 'e-youtube',
44 uniqueId: 'e-youtube-handler',
45 callback: _ref => {
46 let {
47 element
48 } = _ref;
49 const youtubeElement = document.createElement('div');
50 youtubeElement.style.height = '100%';
51 element.appendChild(youtubeElement);
52 const settingsAttr = element.getAttribute('data-settings');
53 const parsedSettings = settingsAttr ? JSON.parse(settingsAttr) : {};
54 const videoId = getYoutubeVideoIdFromUrl(parsedSettings.source);
55 if (!videoId) {
56 return;
57 }
58 let player;
59 let observer;
60 const prepareYTVideo = YT => {
61 const playerOptions = {
62 videoId,
63 events: {
64 onReady: () => {
65 if (parsedSettings.mute) {
66 player.mute();
67 }
68 if (parsedSettings.autoplay) {
69 player.playVideo();
70 }
71 },
72 onStateChange: event => {
73 if (event.data === YT.PlayerState.ENDED && parsedSettings.loop) {
74 player.seekTo(parsedSettings.start || 0);
75 }
76 }
77 },
78 playerVars: {
79 controls: parsedSettings.controls ? 1 : 0,
80 rel: parsedSettings.rel ? 0 : 1,
81 cc_load_policy: parsedSettings.cc_load_policy ? 1 : 0,
82 autoplay: parsedSettings.autoplay ? 1 : 0,
83 start: parsedSettings.start,
84 end: parsedSettings.end
85 }
86 };
87
88 // To handle CORS issues, when the default host is changed, the origin parameter has to be set.
89 if (parsedSettings.privacy) {
90 playerOptions.host = 'https://www.youtube-nocookie.com';
91 playerOptions.origin = window.location.hostname;
92 }
93 player = new YT.Player(youtubeElement, playerOptions);
94 return player;
95 };
96 if (parsedSettings.lazyload) {
97 observer = new IntersectionObserver(entries => {
98 if (entries[0].isIntersecting) {
99 loadYouTubeAPI().then(apiObject => prepareYTVideo(apiObject));
100 observer.unobserve(element);
101 }
102 });
103 observer.observe(element);
104 } else {
105 loadYouTubeAPI().then(apiObject => prepareYTVideo(apiObject));
106 }
107 return () => {
108 if (player && 'function' === typeof player.destroy) {
109 player.destroy();
110 player = null;
111 }
112 if (element.contains(youtubeElement)) {
113 element.removeChild(youtubeElement);
114 }
115 if (observer && 'function' === typeof observer.disconnect) {
116 observer.disconnect();
117 observer = null;
118 }
119 };
120 }
121 });
122
123 /***/ }),
124
125 /***/ "@elementor/frontend-handlers":
126 /*!***********************************************!*\
127 !*** external "elementorV2.frontendHandlers" ***!
128 \***********************************************/
129 /***/ ((module) => {
130
131 module.exports = elementorV2.frontendHandlers;
132
133 /***/ })
134
135 },
136 /******/ __webpack_require__ => { // webpackRuntimeModules
137 /******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId))
138 /******/ var __webpack_exports__ = (__webpack_exec__("../modules/atomic-widgets/elements/atomic-youtube/youtube-handler.js"));
139 /******/ }
140 ]);
141 //# sourceMappingURL=youtube-handler.js.map