PageSourceSearch

https://robotis.com/assets/js/index.js?v=202605201

js robotis.com collected 2026-09-24 08:54:17 UTC 5,132 bytes, 166 lines download raw bytes

1// GSAP + jQuery: section_mission, section_business 애니메이션 (부드러운 스크롤 미사용 버전)
2$(function() {
3	if (typeof gsap === 'undefined' || typeof ScrollTrigger === 'undefined') return;
4
5	// section_mission 페이드업 애니메이션
6	gsap.set('#section_mission', { opacity: 0, y: 60 });
7	gsap.to('#section_mission', {
8		scrollTrigger: {
9			trigger: '#section_mission',
10			start: 'top 80%',
11			toggleActions: 'play none none none'
12		},
13		opacity: 1,
14		y: 0,
15		duration: 1.2,
16		ease: 'power3.out',
17	});
18
19	// section_business: intro_title, intro_desc, intro_image 각각 애니메이션
20	$('.section_business').each(function(_, el) {
21		var $section = $(el);
22		var $title = $section.find('.intro_title');
23		var $desc = $section.find('.intro_desc');
24		var $img = $section.find('.intro_image');
25
26		// 초기 상태 세팅
27		gsap.set([$title[0], $desc[0]], { opacity: 0, y: 40 });
28		gsap.set($img[0], { opacity: 0, scale: 0.95 });
29
30		// 타이틀 애니메이션
31		gsap.to($title[0], {
32			scrollTrigger: {
33				trigger: $section[0],
34				start: 'top 80%'
35			},
36			opacity: 1,
37			y: 0,
38			duration: 0.9,
39			ease: 'power3.out',
40			delay: 0.1
41		});
42		// 설명 애니메이션
43		gsap.to($desc[0], {
44			scrollTrigger: {
45				trigger: $section[0],
46				start: 'top 75%'
47			},
48			opacity: 1,
49			y: 0,
50			duration: 0.9,
51			ease: 'power3.out',
52			delay: 0.3
53		});
54		// 이미지 애니메이션
55		gsap.to($img[0], {
56			scrollTrigger: {
57				trigger: $section[0],
58				start: 'top 70%'
59			},
60			opacity: 1,
61			scale: 1,
62			duration: 1.1,
63			ease: 'power3.out',
64			delay: 0.5
65		});
66	});
67});
68
69 
70// 1. YouTube IFrame API 로드
71var tag = document.createElement('script');
72tag.src = "https://www.youtube.com/iframe_api";
73var firstScriptTag = document.getElementsByTagName('script')[0];
74firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
75var my_video_id = "";  // 로보티즈 영상 ID   
76if(is_mobile==1){
77	my_video_id = "3E4E9bY55VI";  // 숏폼  https://youtube.com/shorts/3E4E9bY55VI
78}else{ 
79	my_video_id = "Q2dYRVE1dmI";  // 롱폼  https://www.youtube.com/watch?v=Q2dYRVE1dmI
80}
81var player;
82function onYouTubeIframeAPIReady() {
83  player = new YT.Player('player', {
84    videoId: my_video_id,
85    playerVars: {
86      'autoplay': 1,
87      'mute': 1,
88      'controls': 0,
89      // loop / playlist 제거 — 재생목록 내비게이션 컨트롤러(이전/다음) 노출 원인
90      'modestbranding': 1,
91      'rel': 0,
92      'iv_load_policy': 3,
93      'playsinline': 1,
94      'disablekb': 1,     // 키보드 단축키 비활성화
95      'fs': 0,            // 전체화면 버튼 숨김
96      'showinfo': 0,      // 영상 정보 숨김 (구버전 플레이어 호환)
97      'cc_load_policy': 0 // 자막 자동 표시 안 함
98    },
99    events: {
100      'onReady': onPlayerReady,
101      'onStateChange': onPlayerStateChange
102    }
103  });
104}
105
106function onPlayerReady(event) {
107  event.target.mute();
108  event.target.playVideo();
109
110  // YouTube iframe에 PIP/미디어 컨트롤 비활성화 속성 추가
111  var iframe = event.target.getIframe();
112  if (iframe) {
113    iframe.setAttribute('disablepictureinpicture', '');
114    iframe.setAttribute('controlslist', 'nodownload nofullscreen noremoteplayback');
115    iframe.style.pointerEvents = 'none';
116  }
117
118  // 브라우저의 미디어 세션 컨트롤(중앙 재생/이전/다음 버튼) 비활성화
119  if ('mediaSession' in navigator) {
120    try {
121      navigator.mediaSession.setActionHandler('play', null);
122      navigator.mediaSession.setActionHandler('pause', null);
123      navigator.mediaSession.setActionHandler('previoustrack', null);
124      navigator.mediaSession.setActionHandler('nexttrack', null);
125      navigator.mediaSession.setActionHandler('seekbackward', null);
126      navigator.mediaSession.setActionHandler('seekforward', null);
127      navigator.mediaSession.setActionHandler('stop', null);
128      navigator.mediaSession.playbackState = 'none';
129    } catch (e) {}
130  }
131}
132
133function onPlayerStateChange(event) {
134  // 영상 재생이 시작되면 검은 화면 방지를 위해 포스터를 숨김
135  if (event.data == YT.PlayerState.PLAYING) {
136    document.getElementById('videoPoster').classList.add('is-hidden');
137    startSeamlessLoop(event.target);
138
139    // 재생 시 브라우저 미디어 세션이 다시 활성화되는 것을 막음
140    if ('mediaSession' in navigator) {
141      try {
142        navigator.mediaSession.playbackState = 'none';
143        navigator.mediaSession.metadata = null;
144      } catch (e) {}
145    }
146  }
147
148  // playlist/loop 옵션을 제거했으므로 영상이 끝나면 수동으로 다시 재생
149  if (event.data == YT.PlayerState.ENDED) {
150    event.target.seekTo(0);
151    event.target.playVideo();
152  }
153}
154
155// 영상 끝부분의 로딩 지연을 없애는 핵심 로직
156function startSeamlessLoop(playerInstance) {
157  setInterval(function() {
158    var duration = playerInstance.getDuration();
159    var currentTime = playerInstance.getCurrentTime();
160    
161    // 영상 종료 0.5초 전에 미리 처음으로 이동시켜 멈춤 현상 제거
162    if (duration > 0 && (duration - currentTime < 0.5)) {
163      playerInstance.seekTo(0);
164    }
165  }, 200);
166}

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.