/**
* 파일명: script.js
* 위치: /assets/js/
* 기능: 메인 JavaScript 기능
* 작성일: 2025-05-10
* 수정일: 2025-05-10
*/
// 페이지 로드 완료 시 로딩 인디케이터 제거 및 기능 초기화
document.addEventListener('DOMContentLoaded', function() {
// 로딩 인디케이터 숨기기 (window.load 이벤트 외에 추가 안전장치)
const loader = document.getElementById('loading-indicator');
if (loader) {
loader.style.display = 'none';
}
// 기존 코드 유지 (폼 제출 시 로딩 상태 표시)
const form = document.querySelector('form');
if (form) {
const submitButton = form.querySelector('button[type="submit"]');
if (submitButton) {
form.addEventListener('submit', function() {
submitButton.disabled = true;
submitButton.innerHTML = ' 분석 중...';
});
}
}
// 입력 필드 자동 포커스
const keywordInput = document.querySelector('input[name="keyword"]');
if (keywordInput && !keywordInput.value) {
keywordInput.focus();
}
// 테이블 행 호버 효과
const tableRows = document.querySelectorAll('tbody tr');
tableRows.forEach(row => {
row.addEventListener('mouseenter', function() {
this.style.backgroundColor = '#f8f9fa';
});
row.addEventListener('mouseleave', function() {
this.style.backgroundColor = '';
});
});
// 추가된 기능: 글자수 카운터 초기화
updateCharCount();
// 추가된 기능: 복사 버튼 이벤트 설정
setupCopyButtons();
// 추가된 기능: 초기화 버튼 이벤트 설정
setupResetButton();
// 추가된 기능: 맨 위로 버튼 이벤트 설정
setupBackToTopButton();
});
/**
* 키워드 입력 글자수 카운터 기능
* 사용자가 키워드 입력 시 현재 글자수를 표시
*/
function updateCharCount() {
var textarea = document.getElementById('search_key');
var counter = document.getElementById('current-chars');
if (textarea && counter) {
counter.textContent = textarea.value.length;
// 입력 시 글자수 업데이트
textarea.addEventListener('input', function() {
counter.textContent = this.value.length;
});
}
}
/**
* 복사 버튼 기능 초기화
* 각 키워드 복사 버튼에 클릭 이벤트 핸들러 추가
*/
function setupCopyButtons() {
document.querySelectorAll('.copy-btn').forEach(function(btn) {
btn.addEventListener('click', function() {
const text = this.getAttribute('data-text');
const msg = this.parentElement.querySelector('.copy-msg');
// 클립보드 API 지원 여부 확인
if (navigator.clipboard) {
navigator.clipboard.writeText(text).then(() => {
showCopySuccess(this, msg);
});
} else {
// 폴백 방식 (레거시 브라우저 지원)
const textarea = document.createElement('textarea');
textarea.value = text;
document.body.appendChild(textarea);
textarea.select();
document.execCommand('copy');
document.body.removeChild(textarea);
showCopySuccess(this, msg);
}
});
});
}
/**
* 복사 성공 시 시각적 피드백 표시 함수
*/
function showCopySuccess(button, msg) {
button.classList.add('success');
button.innerHTML = '';
if(msg) { msg.style.display = 'inline'; }
setTimeout(() => {
button.classList.remove('success');
button.innerHTML = '';
if(msg) { msg.style.display = 'none'; }
}, 1200);
}
/**
* 초기화 버튼 설정
*/
function setupResetButton() {
const resetBtn = document.getElementById('resetBtn');
if (resetBtn) {
resetBtn.addEventListener('click', function() {
if(confirm('정말로 모든 입력값과 검색결과를 초기화하시겠습니까?')) {
var form = document.createElement('form');
form.method = 'POST';
form.action = location.pathname + '#tool';
var input = document.createElement('input');
input.type = 'hidden';
input.name = 'key_del';
input.value = 'del';
form.appendChild(input);
document.body.appendChild(form);
form.submit();
}
});
}
}
/**
* 맨 위로 버튼 기능 설정
*/
function setupBackToTopButton() {
const backToTopBtn = document.getElementById('back-to-top');
// 스크롤 이벤트 리스너 추가
window.addEventListener('scroll', function() {
if (backToTopBtn) {
if(window.scrollY > 200) {
backToTopBtn.classList.add('show');
} else {
backToTopBtn.classList.remove('show');
}
}
});
// 버튼 클릭 이벤트
if (backToTopBtn) {
backToTopBtn.addEventListener('click', function() {
window.scrollTo({top: 0, behavior: 'smooth'});
});
}
}