Şarkı kendiliğinden çalmaya başlıyor - Analiz ve Çözüm
26 Aralık 2025 - Claude AI
Kullanıcı hiçbir yere tıklamadan şarkı/radyo kendiliğinden çalmaya başlıyor.
/radios sayfasına gidince radio otomatik çalıyorNe oluyordu? Sayfa değişirken (SPA navigasyonu) mouse'un altındaki içerik değişiyor. Eğer mouse bir radyo kartının üzerine denk gelirse, tıklama olayı yanlışlıkla tetikleniyordu.
Ayrıca: Birden fazla tab açıkken, arka plandaki tab'da da olaylar tetiklenebiliyordu - müzik oradan çalıyordu.
Ne yaptık? Sayfa değiştikten sonra 200ms boyunca tıklamaları engelleyen bir koruma ekledik. Ayrıca arka plandaki tab'ların müzik başlatmasını engelledik.
204→ 🚀 SPA Navigation: /radios 218→ ✅ Page loaded: /radios 221→ 🎵 playContent called: type=radio, id=7 222→ 🎵 HLS DEBUG... autoplay: true
Sayfa yüklendikten hemen sonra playContent çağrılmış.
Kullanıcı tıklamamış ama click event tetiklenmiş.
/radios linkine tıkladı
BroadcastChannel API kullanılmıyor -
tab'lar arası koordinasyon yok.
spa-router.js
public/themes/muzibu/js/player/features/spa-router.js
+ // 🛡️ CLICK PROTECTION
+ lastNavigationTime: 0,
+ clickProtectionMs: 200,
+
+ isClickProtected() {
+ const elapsed = Date.now() - this.lastNavigationTime;
+ return elapsed < this.clickProtectionMs;
+ }
// DOM değişiminden sonra:
+ MuzibuSpaRouter.lastNavigationTime = Date.now();
play-helpers.js
public/themes/muzibu/js/player/features/play-helpers.js
- window.playContent = async function(type, id) {
+ window.playContent = async function(type, id, options = {}) {
+ const isUserInitiated = options.userInitiated ?? true;
+
+ // 🛡️ CLICK PROTECTION: SPA sonrası 200ms koruma
+ if (isUserInitiated && window.MuzibuSpaRouter?.isClickProtected?.()) {
+ console.warn('🛡️ playContent BLOCKED: Click protection');
+ return;
+ }
+
+ // 🛡️ BACKGROUND TAB PROTECTION
+ if (isUserInitiated && document.hidden) {
+ console.warn('🛡️ playContent BLOCKED: Tab in background');
+ return;
+ }
Kullanıcı "aktif tab'da bile kendiliğinden başladı" dedi. Bu durumda:
playContent'in nereden çağrıldığı tespit edilmeliDebug için:
console.trace()
ile stack trace alınabilir