Aplikasi Jam Digital Masjid Gratis Apr 2026
// inisialisasi + update setiap detik let intervalId; function initApp() getLocationAndUpdate(); // coba ambil data jadwal // update jam tiap 1 detik intervalId = setInterval(() => updateClockAndDate(); , 1000); updateClockAndDate(); testBtn.addEventListener('click', () => stopAzanSound(); triggerAzan("Demo Azan"); ); resetBtn.addEventListener('click', () => stopAzanSound(); azanMsgSpan.classList.remove('azan-active'); azanMsgSpan.innerText = "๐ Suara dihentikan manual"; setTimeout(() => updateAzanMessageDefault(), 2000); );
<script> // ======================== FITUR JAM DIGITAL MASJID GRATIS ======================== // 1. Jam realtime dengan format HH:MM:SS // 2. Jadwal sholat otomatis (API atau fallback offline) + perhitungan sederhana // Menggunakan API gratis Aladhan untuk akurasi (jika online) + fallback manual. // 3. Deteksi waktu sholat berikutnya + highlight // 4. Azan suara (menggunakan Web Audio / synth sederhana, tanpa file eksternal) // 5. Tanggal Hijriah dari API atau fallback lokal. // 6. Mode responsif, tampilan LED dan nuansa masjid. // ------------------------------------------------------------------------------
/* jadwal sholat grid */ .prayer-times margin-top: 28px; display: grid; grid-template-columns: repeat(auto-fit, minmax(100px, 1fr)); gap: 12px; background: rgba(0, 0, 0, 0.5); border-radius: 48px; padding: 18px 12px;
initApp(); </script> </body> </html>
.alert-badge background: #2e2420; color: #fbc490; padding: 5px 16px; border-radius: 28px;
// stop suara function stopAzanSound() if (currentAudio) currentAudio.close().catch(e=>console.log); currentAudio = null; azanMsgSpan.innerText = "โน๏ธ Suara dihentikan"; setTimeout(() => if (azanMsgSpan.innerText === "โน๏ธ Suara dihentikan") // refresh nanti update otomatis , 1500);
button background: #3c6e5f; border: none; color: white; padding: 8px 15px; border-radius: 32px; font-weight: bold; margin-top: 10px; cursor: pointer; transition: 0.2s; font-family: inherit; aplikasi jam digital masjid gratis
let prayerNamesOrder = ["Subuh", "Dzuhur", "Ashar", "Maghrib", "Isya"]; let nextPrayerIndex = -1; let currentAudio = null; // untuk menghentikan azan
// Update jam digital & tgl & cek azan function updateClockAndDate() const now = new Date(); // jam const jam = now.getHours().toString().padStart(2,'0'); const menit = now.getMinutes().toString().padStart(2,'0'); const detik = now.getSeconds().toString().padStart(2,'0'); jamElement.innerText = `$jam:$menit:$detik`; // tanggal Masehi const options = weekday: 'long', year: 'numeric', month: 'long', day: 'numeric' ; tanggalElement.innerText = now.toLocaleDateString('id-ID', options); // cek azan setiap detik checkAzanSchedule(now); // update highlight tiap menit mungkin atau tiap detik juga gpp renderPrayerTimes(now);
// Fungsi untuk memutar suara azan (menggunakan oscillator sederhana, mirip nada panjang) function playAzanSound() // Hentikan audio sebelumnya jika ada if (currentAudio) currentAudio.pause(); currentAudio = null; // Menggunakan AudioContext (web audio) untuk suara azan sederhana try window.webkitAudioContext; const audioCtx = new AudioContextClass(); currentAudio = audioCtx; let startTime = audioCtx.currentTime; // nada azan sederhana: rangkaian frekuensi dan durasi (simulasi panggilan) const notes = [ freq: 440, dur: 0.8 , // A freq: 494, dur: 0.8 , // B freq: 523, dur: 1.0 , // C freq: 587, dur: 0.9 , // D freq: 523, dur: 0.8 , freq: 440, dur: 1.2 , freq: 659, dur: 1.0 , // E freq: 587, dur: 1.2 , freq: 523, dur: 1.5 ]; let timeCursor = startTime; for (let note of notes) const osc = audioCtx.createOscillator(); const gain = audioCtx.createGain(); osc.connect(gain); gain.connect(audioCtx.destination); osc.frequency.value = note.freq; gain.gain.value = 0.35; osc.start(timeCursor); gain.gain.exponentialRampToValueAtTime(0.0001, timeCursor + note.dur); osc.stop(timeCursor + note.dur); timeCursor += note.dur; // tambah nafas panjang const finalOsc = audioCtx.createOscillator(); const finalGain = audioCtx.createGain(); finalOsc.connect(finalGain); finalGain.connect(audioCtx.destination); finalOsc.frequency.value = 440; finalGain.gain.value = 0.3; finalOsc.start(timeCursor); finalGain.gain.exponentialRampToValueAtTime(0.0001, timeCursor + 2.2); finalOsc.stop(timeCursor + 2.2); // resume jika suspended if (audioCtx.state === 'suspended') audioCtx.resume(); // status selesai cleanup setTimeout(() => if (currentAudio === audioCtx) currentAudio = null; , (timeCursor + 2.5) * 1000); catch(e) console.warn("AudioContext error:", e); azanMsgSpan.innerText = "โ ๏ธ Browser tidak support audio, azan visual tetap aktif."; // inisialisasi + update setiap detik let intervalId;
.date-info font-size: 1.6rem; font-weight: 500; color: #f3e5ab; background: #1a2f2b80; display: inline-block; padding: 6px 20px; border-radius: 40px; backdrop-filter: blur(2px); margin-top: 8px;
// Flag azan sudah dipanggil untuk waktu yang sama let lastAzanTriggerHourMin = "";