File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
<!DOCTYPE html>
<html lang="ko">
<head>
<title>온세종학교</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="Author" content="">
<meta name="Keywords" content="">
<meta name="Description" content="">
<meta name="format-detection" content="telephone=no">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=0">
<link href="/resources/front/site/SITE_00000/css/style.css" rel="stylesheet">
<!-- 공통 plugin -->
<script src="/resources/front/site/SITE_00000/js/common/jquery/jquery-3.6.0.min.js"></script>
<script src="/resources/front/site/SITE_00000/js/common/jquery/jquery-ui.min.js"></script>
<!-- //공통 plugin -->
<!-- 페이지 plugin-->
<!-- painter -->
<!-- <script type="module" src="/resources/front/site/SITE_00000/js/common/module/colouredPenciles.js"></script> -->
<!-- <script type="module" defer src="/resources/front/site/SITE_00000/js/timer.js"></script> -->
<!-- //painter -->
<!-- //페이지 plugin-->
<!-- 공통 퍼블 layout: 개발시 삭제-->
<!-- <script src="/resources/front/site/SITE_00000/js/_layout.js"></script> -->
<!--//퍼블 layout-->
<!-- 공통 메뉴 js-->
<!-- //공통 메뉴 js -->
<!--공통 퍼블 js-->
<script src="/resources/front/site/SITE_00000/js/common.js"></script>
<script src="/resources/front/site/SITE_00000/js/common-custom.js"></script>
<!--//공통 퍼블 js-->
</head>
<body>
<div class="btn-cont">
<button class="btn lg" onclick="popupOpenPub('timer')">타이머</button>
</div>
<div class="popup-modal sm" data-popuppub="timer">
<div class="pop-header">
<h1>타이머</h1>
</div>
<div class="pop-body">
<div class="timer-area">
<div class="timer-input-area">
<div class="input-area">
<input type="number" value="00" min="0" max="99" readonly class="input-minute">
<span>:</span>
<input type="number" value="00" min="0" max="59" readonly class="input-second">
</div>
<div class="sound-area">
<label class="btn-sound">
<input type="checkbox" checked><span class="btn circle overlay ico-sound">소리</span>
</label>
</div>
</div>
<div class="control-area">
<button type="button" class="btn-play-toggle btn lg cta ico-play">시작</button>
<button type="button" class="btn-reset btn ghost circle ico-refresh">재설정</button>
</div>
<ul class="option-area">
<li class="option-minute">
<div class="setting-area">
<button type="button" class="btn circle sm ico-down"></button>
<span>분</span>
<button type="button" class="btn circle sm ico-up"></button>
</div>
<div class="btn-group">
<button class="btn sm ico-plus">5분</button>
<button class="btn sm ico-plus">10분</button>
<button class="btn sm ico-plus">30분</button>
</div>
</li>
<li class="option-second">
<div class="setting-area">
<button type="button" class="btn circle sm ico-down"></button>
<span>초</span>
<button type="button" class="btn circle sm ico-up"></button>
</div>
<div class="btn-group">
<button class="btn sm ico-plus">5초</button>
<button class="btn sm ico-plus">10초</button>
<button class="btn sm ico-plus">30초</button>
</div>
</li>
</ul>
</div>
</div>
<button type="button" class="pop-close cls"><span class="txt-hide">팝업닫기</span></button>
</div>
<!-- toast -->
<div class="toast"></div>
<!--popup-->
<div class="dim"></div>
<script>
document.addEventListener('DOMContentLoaded', function () {
const timerModule = (function () {
// 타이머 상태
let timerInterval;
let isRunning = false;
let totalSeconds = 0;
const audio = new Audio("/resources/front/site/SITE_00000/images/custom/class/tick.mp3");
const startStopBtn = document.querySelector('.btn-play-toggle');
const resetBtn = document.querySelector('.btn-reset');
const minuteInput = document.querySelector('.input-minute');
const secondInput = document.querySelector('.input-second');
const soundCheckbox = document.querySelector('.btn-sound input[type="checkbox"]');
const minutePlusBtns = document.querySelectorAll('.option-minute .btn-group .btn');
const secondPlusBtns = document.querySelectorAll('.option-second .btn-group .btn');
const minuteUpBtn = document.querySelector('.option-minute .setting-area .ico-up');
const minuteDownBtn = document.querySelector('.option-minute .setting-area .ico-down');
const secondUpBtn = document.querySelector('.option-second .setting-area .ico-up');
const secondDownBtn = document.querySelector('.option-second .setting-area .ico-down');
const optionCont = document.querySelector('.option-area');
const popCloseBtn = document.querySelector('.pop-close');
const dim = document.querySelector('.dim');
// 시간 갱신 함수
function updateDisplay() {
const minutes = Math.floor(totalSeconds / 60);
const seconds = totalSeconds % 60;
minuteInput.value = String(minutes).padStart(2, '0');
secondInput.value = String(seconds).padStart(2, '0');
}
// .option-container에 is-disabled 추가
function disableOptions() {
optionCont.classList.add('is-disabled');
}
// .option-container에서 is-disabled 제거
function enableOptions() {
optionCont.classList.remove('is-disabled');
}
// 소리 재생 함수
function playAudio() {
if (soundCheckbox.checked) {
audio.play().catch((error) => {
console.error('소리 재생 오류:', error);
});
}
}
// 소리 정지 함수
function stopAudio() {
audio.pause();
audio.currentTime = 0; // 재생 위치 초기화
}
// 소리 체크박스 상태 변경 이벤트
soundCheckbox.addEventListener('change', () => {
if (soundCheckbox.checked && isRunning) {
playAudio();
} else {
stopAudio();
}
});
// 타이머 시작/정지
function startStopTimer() {
if (isRunning) {
clearInterval(timerInterval);
stopAudio();
startStopBtn.textContent = '시작';
enableOptions();
} else {
if (totalSeconds === 0) {
toastShow('시간을 세팅해주세요.');
return;
}
if (soundCheckbox.checked) {
playAudio();
}
disableOptions();
timerInterval = setInterval(() => {
if (totalSeconds > 0) {
totalSeconds--;
updateDisplay();
} else {
clearInterval(timerInterval);
toastShow('타이머 종료');
stopAudio();
startStopBtn.textContent = '시작';
enableOptions();
isRunning = false;
}
}, 1000);
startStopBtn.textContent = '정지';
}
isRunning = !isRunning;
}
// 타이머 재설정
function resetTimer() {
clearInterval(timerInterval);
isRunning = false;
totalSeconds = 0;
updateDisplay();
startStopBtn.textContent = '시작';
stopAudio();
enableOptions();
}
// 분/초 조정 함수
function adjustTime(inputElement, adjustment, maxValue) {
let currentValue = parseInt(inputElement.value, 10);
currentValue += adjustment;
if (currentValue > maxValue) currentValue = maxValue;
if (currentValue < 0) currentValue = 0; // 최소값을 0으로 제한
inputElement.value = String(currentValue).padStart(2, '0');
// totalSeconds 다시 계산
const minutes = parseInt(minuteInput.value, 10);
const seconds = parseInt(secondInput.value, 10);
totalSeconds = minutes * 60 + seconds;
}
// 분 조정 함수
function adjustMinutes(inputElement, minutesToAdd) {
let currentValue = parseInt(inputElement.value, 10);
currentValue += minutesToAdd;
if (currentValue > 60) currentValue = 60;
if (currentValue < 0) currentValue = 0; // 최소값을 0으로 제한
inputElement.value = String(currentValue).padStart(2, '0');
// totalSeconds 다시 계산
const seconds = parseInt(secondInput.value, 10);
totalSeconds = currentValue * 60 + seconds;
}
// 초 조정 함수
function adjustSeconds(inputElement, secondsToAdd) {
let currentValue = parseInt(inputElement.value, 10);
currentValue += secondsToAdd;
if (currentValue > 59) currentValue = 59;
if (currentValue < 0) currentValue = 0; // 최소값을 0으로 제한
inputElement.value = String(currentValue).padStart(2, '0');
// totalSeconds 다시 계산
const minutes = parseInt(minuteInput.value, 10);
totalSeconds = minutes * 60 + currentValue;
}
// 시간 추가 버튼들
function addMinutes(index) {
const minutesToAdd = [5, 10, 30][index];
totalSeconds += minutesToAdd * 60;
// 분 최대값 60으로 제한
if (totalSeconds > 60 * 60) {
totalSeconds = 60 * 60;
}
updateDisplay();
}
function addSeconds(index) {
const secondsToAdd = [5, 10, 30][index];
totalSeconds += secondsToAdd;
// 초가 60초를 넘지 않도록 제한
if (totalSeconds > 60 * 60) {
totalSeconds = 60 * 60;
}
updateDisplay();
}
// 이벤트 리스너 등록
startStopBtn.addEventListener('click', startStopTimer);
resetBtn.addEventListener('click', resetTimer);
minutePlusBtns.forEach((btn, index) => btn.addEventListener('click', () => addMinutes(index)));
secondPlusBtns.forEach((btn, index) => btn.addEventListener('click', () => addSeconds(index)));
minuteUpBtn.addEventListener('click', () => adjustMinutes(minuteInput, 1));
minuteDownBtn.addEventListener('click', () => adjustMinutes(minuteInput, -1));
secondUpBtn.addEventListener('click', () => adjustSeconds(secondInput, 1));
secondDownBtn.addEventListener('click', () => adjustSeconds(secondInput, -1));
popCloseBtn.addEventListener('click', resetTimer);
dim.addEventListener('click', resetTimer);
return {
resetTimer,
startStopTimer,
updateDisplay,
};
})();
// 팝업 열기
popupOpenPub('timer');
});
</script>
</body>
</html>