PageSourceSearch

https://www.kinds.or.kr/assets_2024/js/ui_new.js;Bigkinds=82BBAC27…?timestamp=20260925042139324

js kinds.or.kr collected 2026-09-24 19:22:04 UTC 17,289 bytes, 573 lines download raw bytes

1$(document).ready(function() {
2	// 팝업창 이벤트
3	$('.add-depth').on('click', function (e) {
4		e.preventDefault();
5		
6		const $pop = $(this).closest('.modal').find('.province-pop');
7		
8		const buttonOffset = $(this).offset(); 
9		const buttonHeight = $(this).outerHeight();
10		
11		$('.add-depth').not(this).removeClass('on');
12		$('.province-pop').not($pop).hide();
13		
14		if ($pop.is(':visible')) {
15			$pop.hide();
16		} else {
17			$pop.show();
18			var popWidth = $pop.outerWidth(); 
19			var leftPosition = buttonOffset.left + 4;
20			
21			// 팝업이 화면 오른쪽을 벗어나는 경우 오른쪽으로 위치 조정
22			if (leftPosition + popWidth > $(window).width()) {
23				leftPosition = buttonOffset.left - popWidth + 8;
24			}
25			
26			$pop.css({
27				display: 'grid',
28				position: 'absolute',
29				top: buttonOffset.top + buttonHeight + 4,
30				left: leftPosition
31			}).show();
32			
33			$(this).addClass('on');
34		}
35	});
36  
37  // 화면 외부 클릭 시 팝업 숨김 처리
38  $(document).on('click', function (e) {
39    if (!$(e.target).closest('.province-pop, .add-depth').length) {
40        $('.province-pop').hide();
41        $('.add-depth').removeClass('on');
42    }
43  });
44  
45// 언론사 선택 이벤트
46const mySlList = document.getElementById('ds-modal').querySelector('.sl-item-wrap'); 
47const mySlList2 = document.getElementById('media-modal').querySelector('.sl-item-wrap'); 
48/*
49document.querySelector('.meida-list-con').addEventListener('change', function (event) {
50    const checkbox = event.target;
51
52    // 체크박스가 클릭된 경우
53    if (checkbox.type === 'checkbox') {
54        const label = checkbox.nextElementSibling;
55        const labelText = label.querySelector('img').getAttribute('alt'); // 선택된 언론사 이름
56
57        // 이미 선택된 항목인지 확인
58        const existingItem = [...mySlList.children].find(item => item.querySelector('.sl-value').textContent === labelText);
59
60        if (checkbox.checked) {
61            if (existingItem) {
62                alert('이미 선택된 항목입니다.');
63                checkbox.checked = false;
64                return;
65            }
66
67            const slItem = document.createElement('button');
68            slItem.type = 'button';
69            slItem.className = 'sl-item';
70
71            const slValue = document.createElement('span');
72            slValue.className = 'sl-value';
73            slValue.textContent = labelText || '선택된 항목';
74
75            // 이미지 삭제 아이콘 추가
76            const deleteIcon = document.createElement('span');
77            deleteIcon.className = 'sl-del fn-center';
78
79            const deleteImg = document.createElement('img');
80            deleteImg.src = '../resources/img/icon/close.svg';
81            deleteImg.style.minWidth = '8px';
82            deleteImg.style.width = '8px';
83            deleteImg.alt = '삭제'; // alt 속성 추가
84
85            deleteIcon.appendChild(deleteImg); // 이미지가 삭제 아이콘을 감싸도록
86
87            // 삭제 버튼 이벤트
88            slItem.addEventListener('click', function () {
89                slItem.remove();
90                checkbox.checked = false;
91                if (mySlList.children.length === 0) {
92                    mySlList.parentElement.classList.remove('on');
93                }
94            });
95
96            slItem.append(slValue, deleteIcon);
97            mySlList.append(slItem); // .my-sl-list에 추가
98
99            mySlList.parentElement.classList.add('on');
100        } else {
101            // 체크박스가 해제된 경우, 해당 항목 삭제
102            if (existingItem) {
103                existingItem.remove();
104            }
105            // .my-sl-list에 .sl-item이 없으면 'on' 클래스 제거
106            if (mySlList.children.length === 0) {
107              mySlList.parentElement.classList.remove('on');
108          }
109        }
110    }
111});
112*/
113document.querySelectorAll('.favorite').forEach((button) => {
114	button.addEventListener('click', function() {
115		const li = this.closest('li'); 
116		const imgAlt = li.querySelector('.attr-img')?.getAttribute('alt');
117
118		const existingItem = [...mySlList2.children].find(
119			(item) => item.querySelector('.sl-value').textContent === imgAlt
120		);
121
122		// 'on' 클래스 토글
123		li.classList.toggle('on');
124
125		// 'on' 클래스 제거 시, 해당 항목 삭제
126		if (!li.classList.contains('on') && existingItem) {
127			existingItem.remove();
128		}
129
130		// 'on' 클래스 추가 시, 새로운 항목 생성
131		if (li.classList.contains('on')) {
132			const slItem = document.createElement('button');
133			slItem.type = 'button';
134			slItem.className = 'sl-item';
135
136			const slValue = document.createElement('span');
137			slValue.className = 'sl-value';
138			slValue.textContent = imgAlt;
139			
140			const deleteIcon = document.createElement('span');
141			deleteIcon.className = 'sl-del fn-center';
142			
143			const deleteImg = document.createElement('img');
144			deleteImg.src = '/assets_2024/img/icon/close.svg';
145			deleteImg.style.minWidth = '8px';
146			deleteImg.style.width = '8px';
147			deleteImg.alt = '삭제';
148			
149			// 삭제 버튼 이벤트 추가
150			deleteIcon.appendChild(deleteImg);
151			slItem.append(slValue, deleteIcon);
152			
153			slItem.addEventListener('click', function () {
154				slItem.remove();
155				li.classList.remove('on'); 
156				updateButtonState();
157			});
158			
159			mySlList2.appendChild(slItem);
160			mySlList2.parentElement.classList.add('on');
161		}
162		
163		// 버튼 상태 업데이트
164		updateButtonState();
165	});
166});
167
168
169
170
171
172$(document).on('click', '#ig-sd-btn', function(){
173    $('#ds-modal').addClass('in');
174    $('body').css('overflow','hidden');
175    $.fn.fullpage.setAllowScrolling(false); 
176    $.fn.fullpage.setKeyboardScrolling(false);
177  });
178
179$(document).on('click', '.issupop-btn', function(){
180    $('#issuPop').addClass('in');
181    $('body').css('overflow','hidden');
182    $.fn.fullpage.setAllowScrolling(false); 
183    $.fn.fullpage.setKeyboardScrolling(false);
184  });
185
186
187
188  $('.modal .close').on('click',function(){
189    $(this).closest('.modal').removeClass('in');
190    $('body').css('overflow','initial');
191    $.fn.fullpage.setAllowScrolling(true); 
192    $.fn.fullpage.setKeyboardScrolling(true); 
193  });
194
195$('.mysetting-btn').on('click',function(){
196  $('#my-keyword-modal').addClass('in');
197  $.fn.fullpage.setAllowScrolling(false); 
198  $.fn.fullpage.setKeyboardScrolling(false);
199});
200
201  $('.modal .close2').on('click',function(){
202    $(this).closest('.modal').removeClass('in');
203  });
204
205
206/**
207	언론사 즐겨찾기 - modal show event
208 */
209$(document).on('click', '.mda-add-btn', function() {
210	const ulList = $('#media-modal ul.meida-list-con');
211	const preferList = window.localStorage.getItem('preferProviderList');
212	let preferArr;
213	
214	if(preferList) {
215		if(preferList.indexOf(',') > -1) {
216			preferArr = preferList.split(',');
217		} else {
218			preferArr = [preferList];
219		}
220	}
221	// 기존 즐찾 초기화
222	$('#media-modal .reset-btn').click();
223	//ulList.children('li').removeClass('on');
224	
225	if(preferArr) {
226		$(mySlList2).children().remove();
227		for(const pref of preferArr) {
228			const li = ulList.find(`li[data-provider-code="${pref}"]`);
229			const imgAlt = li.find('.attr-img').attr('alt');
230			const slItem = $('<button>').attr('type', 'button').addClass('sl-item');
231			const slValue = $('<span>').addClass('sl-value').text(imgAlt);
232			const deleteIcon = $('<span>').addClass('sl-del fn-center');
233			const deleteImg = $('<img>').attr('src', '/assets_2024/img/icon/close.svg').attr('alt', '삭제').css({minWidth: '8px', width: '8px'});
234			
235			li.addClass('on');
236			// 모달 하단 삭제 버튼 추가
237			deleteIcon.append(deleteImg);
238			slItem.append(slValue, deleteIcon);
239			
240			slItem.on('click', function () {
241				slItem.remove();
242				li.removeClass('on'); 
243				updateButtonState();
244			});
245			
246			$(mySlList2).append(slItem);
247			$(mySlList2).parent().addClass('on');
248		}
249	}
250	updateButtonState();
251	
252	$('#media-modal').addClass('in');
253	$('#media-modal').modal('show');
254	$.fn.fullpage.setAllowScrolling(false); 
255	$.fn.fullpage.setKeyboardScrolling(false);
256});
257
258$('.news-item').on('click',function(){
259	$('.news-item').removeClass('on');
260	$(this).addClass('on');
261});
262
263
264const $tabs = $('.tab-btn');
265const $horiz = $('.horiz');
266const $contents = $('.ds-tab-con');
267
268$tabs.on('click', function (event) {
269  event.preventDefault(); // 기본 동작 막기
270
271  const $tab = $(this); // 현재 클릭된 탭
272  const tabRect = $tab[0].getBoundingClientRect(); // 클릭된 탭의 위치와 크기
273  const parentRect = $tab.parent().parent()[0].getBoundingClientRect(); // 부모 컨테이너 기준 위치
274
275  // horiz 이동
276  $horiz.css({
277    width: `${tabRect.width}px`,
278    left: `${tabRect.left - parentRect.left}px`,
279  });
280
281  // 현재 활성 탭 상태 업데이트
282  $tabs.parent().removeClass('on'); // 모든 탭에서 클래스 제거
283  $tab.parent().addClass('on'); // 현재 탭에 클래스 추가
284
285  const index = $tabs.index($tab);
286  $contents.removeClass('open');
287  $contents.eq(index).addClass('open');
288
289});
290
291
292const $slItemWrap = $('.sl-item-wrap');
293
294let isMouseDown = false;
295let startX;
296let scrollLeft;
297
298// 마우스 클릭 시
299$slItemWrap.on('mousedown', function (e) {
300  isMouseDown = true;
301  startX = e.pageX - $slItemWrap.offset().left;
302  scrollLeft = $slItemWrap.scrollLeft();
303});
304
305// 마우스 이동 시
306$slItemWrap.on('mousemove', function (e) {
307  if (!isMouseDown) return;
308  e.preventDefault();
309  const x = e.pageX - $slItemWrap.offset().left;
310  const walk = (x - startX) * 2; // 드래그 속도 조절 (여기서는 2배 속도)
311  $slItemWrap.scrollLeft(scrollLeft - walk);
312});
313
314// 마우스 버튼 해제 시
315$slItemWrap.on('mouseup', function () {
316  isMouseDown = false;
317});
318
319// 터치 이벤트 처리
320$slItemWrap.on('touchstart', function (e) {
321  isMouseDown = true;
322  startX = e.touches[0].pageX - $slItemWrap.offset().left;
323  scrollLeft = $slItemWrap.scrollLeft();
324});
325
326$slItemWrap.on('touchmove', function (e) {
327  if (!isMouseDown) return;
328  e.preventDefault();
329  const x = e.touches[0].pageX - $slItemWrap.offset().left;
330  const walk = (x - startX) * 2;
331  $slItemWrap.scrollLeft(scrollLeft - walk);
332});
333
334$slItemWrap.on('touchend', function () {
335  isMouseDown = false;
336});
337
338
339$('.st3-head .tab-2depth a').click(function(e) {
340  e.preventDefault();
341  
342  $(this).closest('.st3-head').find('.tab-2depth a').removeClass('on');
343  $(this).addClass('on');
344});
345
346
347
348const $se2Tabs = $('.noticetab-btn');
349const $horizontality = $('.horizontality');
350const $se2Inner = $('.se2-inner-con');
351
352$se2Tabs.on('click', function (event) {
353  event.preventDefault(); // 기본 동작 막기
354
355  const $tab = $(this); // 현재 클릭된 탭
356  const tabRect = $tab[0].getBoundingClientRect();
357  const parentRect = $tab.parent().parent()[0].getBoundingClientRect(); // 부모 컨테이너 기준 위치
358
359  $horizontality.css({
360    width: `${tabRect.width}px`,
361    left: `${tabRect.left - parentRect.left}px`,
362  });
363
364  // 현재 활성 탭 상태 업데이트
365  $se2Tabs.removeClass('active'); 
366  $tab.addClass('active'); 
367
368  const index = $se2Tabs.index($tab);
369  $se2Inner.removeClass('open');
370  $se2Inner.eq(index).addClass('open');
371
372});
373
374
375});
376
377document.addEventListener('DOMContentLoaded', () => {
378  // 포커스 가능한 div 요소를 선택
379  document.querySelectorAll('.bk-2depth > div[tabindex="0"]').forEach(div => {
380    div.addEventListener('keydown', event => {
381      if (event.key === 'Enter') {
382        const radioId = div.getAttribute('data-radio');
382 // 연결된 radio의 ID 가져오기
383        const radioInput = document.getElementById(radioId);
384
385        if (radioInput && radioInput.type === 'radio') {
386          radioInput.checked = true; // 라디오 버튼 활성화
387          radioInput.click(); // onclick 이벤트 트리거
388        }
389      }
390    });
391  });
392});
393
394
395
396
397// 검색영역 이벤트발생
398document.addEventListener('DOMContentLoaded', () => {
399    const edTextarea = document.querySelector('.editable');
400    const sendSvg = document.querySelector('.send-btn svg path');
401	
402	if(edTextarea) {
403		edTextarea.addEventListener('focus', () => {
404			// 포커스가 되었을 때
405		});
406		
407		edTextarea.addEventListener('blur', () => {
408			// 포커스가 해제되었을 때
409			if (edTextarea.value.trim() === '') {
410			}
411		});
412		
413		edTextarea.addEventListener('input', () => {
414			// 텍스트 입력 시
415			if (edTextarea.value.trim() !== '') {
416				sendSvg.style.fill = 'var(--primary)';
417			
418			} else {
419				sendSvg.style.fill = '';
420			}
421		});
422	}
423  
424});
425
426// 채팅 5번 초과됬을때 disabled 처리
427
428document.addEventListener('DOMContentLoaded', function () {
429    const camTextarea = document.getElementById('cam-textarea');
430    const chatSearch = document.getElementById('chat-search');
431    const Switch = document.getElementById('switch');
432    const Button = document.querySelector('.media-sl-btn');
433    const fileBtn = document.querySelector('.file-add');
434    let enterCount = 0;
435
436	if(camTextarea) {
437		camTextarea.addEventListener('keydown', function (e) {
438			// Enter 키인지 확인
439			if (e.key === 'Enter') {
440				enterCount++;
441			}
442			
443			// Enter 키가 5회를 초과하면 클래스 추가
444			if (enterCount > 5) {
445				camTextarea.disabled = true;
446				camTextarea.placeholder = '로그인을 하시면 계속 질문하실 수 있습니다.';
447				chatSearch.classList.add('disabled');
448				Switch.checked = false;
449				Button.disabled = true;
450				fileBtn.disabled = true;
451			}
452		});
453		
454		// 선택적으로 Enter 횟수 초기화 기능
455		camTextarea.addEventListener('input', function () {
456		});
457	}
458});
459
460
461$(function() {
462	// 언론사별 즐겨찾기 - 초기화 버튼 클릭 이벤트
463	$('#media-modal .reset-btn').on('click', function(e) {
464		e.preventDefault();
465		
466		const mySlList2 = $('#media-modal .sl-item-wrap');
467		
468		mySlList2.children().remove();
469		mySlList2.parent().removeClass('on');
470		
471		$('#media-modal .meida-list-con').children().removeClass('on');
472		
473		// 선택한 언론사 개수 변경
474		updateButtonState();
475	});
476
477	// 언론사별 즐겨찾기 - 언론사 선택 버튼 클릭 이벤트
478	$('#media-modal .apply-btn').on('click', function(e) {
479		e.preventDefault();
480		saveUserCustom();
481	});
482});
483
484/**
485	언론사 즐겨찾기 - 초기화, 등록 버튼 상태 최신화
486 */
487function updateButtonState() {
488	// li에 'on' 클래스가 하나라도 있으면 버튼 활성화, 없으면 비활성화
489	const mySlList2 = document.getElementById('media-modal').querySelector('.sl-item-wrap');
490	const modalButtons = document.getElementById('media-modal').querySelectorAll('.modal-btn-wrap button');
491	const hasOnClass = document.getElementById('media-modal').querySelectorAll('li.on').length > 0;
492	
493	modalButtons.forEach((button) => { 
494		// 'on' 클래스가 하나라도 있으면 버튼을 활성화 (disabled = false)
495		// 'on' 클래스가 하나도 없으면 버튼을 비활성화 (disabled = true)
496		button.disabled = !hasOnClass;
497	});
498
499	if (mySlList2.querySelectorAll('.sl-item').length === 0) {
500		mySlList2.parentElement.classList.remove('on');
501	}
502	
503	// 선택한 언론사 개수 변경
504	document.querySelector('.data-num').innerHTML = mySlList2.querySelectorAll('.sl-item').length;
505}
506
507/**
508	언론사 즐겨찾기 - save event
509 */
510function saveUserCustom(){
511	const account = authManager.account;
512	
513	if(account != null){
514		const $loading = $('.mainSection.sec_two .loading2');
515		const preferLi = $('#media-modal .meida-list-con').find('li.on');
516		let preferProviderList = [];
517		
518		preferLi.each(function() {
519			preferProviderList.push($(this).attr('data-provider-code'));
520		});
521		
522		window.localStorage.setItem("preferProviderList", preferProviderList);
523		
524		var param = {
525			userSn: account.userSn.toString(),
526			fastMenu: window.localStorage.getItem("fastMenuCheckedList"),
527			preferProvider: window.localStorage.getItem("preferProviderList")
528		};
529		
530		$.ajax({
531			url: "/api/account/saveUserCustomize.do",
532			type: "POST",
533			contentType: "application/json",
534			data: JSON.stringify(param),
535			dataType: "json",
536			beforeSend: function() {
537				$loading.show();
538			},
539			success: function(data) {
540				showPreferNews();
541				
542				$('#media-modal').removeClass('in');
543				$('#media-modal').modal('hide');
544				$.fn.fullpage.setAllowScrolling(true); 
545				$.fn.fullpage.setKeyboardScrolling(true);
546				
547				openAlertPop({
548					text: '즐겨찾기 언론사가 설정 되었습니다.',
549					img: 'success',
550					showButtons: {
551						cancel: false,	// 취소 버튼
552						confirm: true	// 확인 버튼
553					}
554				});
555			},
556			complete: function() {
557				$loading.hide();
558			},
559			error: function(xhr, status, error) {
560				console.error(error);
561			}
562		});
563	}else{
564		openAlertPop({
565			text: '로그인 후 사용해 주세요.',
566			img: 'warning',
567			showButtons: {
568				cancel: false,	// 취소 버튼
569				confirm: true	// 확인 버튼
570			}
571		});
572	}
573}

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.