/** * 파일명: 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'}); }); } }