PluginProbe
Elementor Website Builder – more than just a page builder / 4.3.0-beta3
Elementor Website Builder – more than just a page builder v4.3.0-beta3
4.3.0-beta3 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 All 452 releases
elementor / assets / js / youtube-handler.js

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

106 lines 3.4 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 "use strict";
2
3 (function() {
4
5 //#region \0rolldown/runtime.js
6 var __defProp = Object.defineProperty;
7 var __name = (target, value) => __defProp(target, "name", {
8 value,
9 configurable: true
10 });
11
12 //#endregion
13
14 //#region modules/atomic-widgets/elements/atomic-youtube/youtube-handler.js
15 var _frontendHandlers = (globalThis.elementorV2.frontendHandlers);
16 var getYoutubeVideoIdFromUrl = (url) => {
17 const match = url.match(/^(?:https?:\/\/)?(?:www\.)?(?:m\.)?(?:youtu\.be\/|youtube\.com\/(?:(?:watch)?\?(?:.*&)?vi?=|(?:embed|v|vi|user|shorts)\/))([^?&"'>]+)/);
18 return match ? match[1] : null;
19 };
20 var loadYouTubeAPI = () => {
21 return new Promise((resolve) => {
22 if (window.YT && window.YT.loaded) {
23 resolve(window.YT);
24 return;
25 }
26 const YOUTUBE_IFRAME_API_URL = "https://www.youtube.com/iframe_api";
27 if (!document.querySelector(`script[src="${YOUTUBE_IFRAME_API_URL}"]`)) {
28 const tag = document.createElement("script");
29 tag.src = YOUTUBE_IFRAME_API_URL;
30 const firstScriptTag = document.getElementsByTagName("script")[0];
31 firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
32 }
33 const checkYT = () => {
34 if (window.YT && window.YT.loaded) resolve(window.YT);
35 else setTimeout(checkYT, 350);
36 };
37 checkYT();
38 });
39 };
40 (0, _frontendHandlers.register)({
41 elementType: "e-youtube",
42 id: "e-youtube-handler",
43 callback: ({ element }) => {
44 const youtubeElement = document.createElement("div");
45 youtubeElement.style.height = "100%";
46 element.appendChild(youtubeElement);
47 const settingsAttr = element.getAttribute("data-settings");
48 const parsedSettings = settingsAttr ? JSON.parse(settingsAttr) : {};
49 const videoId = getYoutubeVideoIdFromUrl(parsedSettings.source);
50 if (!videoId) return;
51 let player;
52 let observer;
53 const prepareYTVideo = (YT) => {
54 const playerOptions = {
55 videoId,
56 events: {
57 onReady: () => {
58 if (parsedSettings.mute) player.mute();
59 if (parsedSettings.autoplay) player.playVideo();
60 },
61 onStateChange: (event) => {
62 if (event.data === YT.PlayerState.ENDED && parsedSettings.loop) player.seekTo(parsedSettings.start || 0);
63 }
64 },
65 playerVars: {
66 controls: parsedSettings.controls ? 1 : 0,
67 rel: parsedSettings.rel ? 0 : 1,
68 cc_load_policy: parsedSettings.cc_load_policy ? 1 : 0,
69 autoplay: parsedSettings.autoplay ? 1 : 0,
70 start: parsedSettings.start,
71 end: parsedSettings.end
72 }
73 };
74 if (parsedSettings.privacy) {
75 playerOptions.host = "https://www.youtube-nocookie.com";
76 playerOptions.origin = window.location.hostname;
77 }
78 player = new YT.Player(youtubeElement, playerOptions);
79 return player;
80 };
81 if (parsedSettings.lazyload) {
82 observer = new IntersectionObserver((entries) => {
83 if (entries[0].isIntersecting) {
84 loadYouTubeAPI().then((apiObject) => prepareYTVideo(apiObject));
85 observer.unobserve(element);
86 }
87 });
88 observer.observe(element);
89 } else loadYouTubeAPI().then((apiObject) => prepareYTVideo(apiObject));
90 return () => {
91 if (player && "function" === typeof player.destroy) {
92 player.destroy();
93 player = null;
94 }
95 if (element.contains(youtubeElement)) element.removeChild(youtubeElement);
96 if (observer && "function" === typeof observer.disconnect) {
97 observer.disconnect();
98 observer = null;
99 }
100 };
101 }
102 });
103
104 //#endregion
105 })();
106 //# sourceMappingURL=youtube-handler.js.map