/** * Голосовой ввод для полей поиска. * Автоматически добавляет кнопку микрофона к каждому input с классом "voice-input". * Использует Web Speech API (Chrome, Edge, Safari). */ (function() { var activeRecognition = null; function initVoiceInput(input) { var parent = input.parentNode; var wrap; var parentStyle = window.getComputedStyle(parent); if (parentStyle.position === 'relative') { wrap = parent; } else { wrap = document.createElement('div'); wrap.className = 'voice-input-wrap'; parent.insertBefore(wrap, input); wrap.appendChild(input); } var btn = document.createElement('button'); btn.type = 'button'; btn.className = 'voice-input-btn'; btn.title = 'Голосовой ввод'; btn.innerHTML = ''; wrap.appendChild(btn); var clearBtn = wrap.querySelector('.search-clear-btn'); if (clearBtn) { btn.classList.add('voice-input-btn--with-clear'); } btn.addEventListener('click', function(e) { e.preventDefault(); e.stopPropagation(); var SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition; if (!SpeechRecognition) { alert('Голосовой ввод не поддерживается в этом браузере. Используйте Chrome или Edge.'); return; } if (activeRecognition) { activeRecognition.abort(); activeRecognition = null; return; } var recognition = new SpeechRecognition(); recognition.lang = 'ru-RU'; recognition.interimResults = false; recognition.continuous = false; recognition.maxAlternatives = 1; activeRecognition = recognition; btn.classList.add('voice-input-btn--active'); recognition.onresult = function(event) { var transcript = event.results[0][0].transcript; var current = input.value; input.value = current ? (current + ' ' + transcript) : transcript; if (typeof jQuery !== 'undefined') { jQuery(input).trigger('input'); } else { input.dispatchEvent(new Event('input', { bubbles: true })); } input.focus(); }; recognition.onerror = function() { btn.classList.remove('voice-input-btn--active'); activeRecognition = null; }; recognition.onend = function() { btn.classList.remove('voice-input-btn--active'); activeRecognition = null; }; recognition.start(); }); } function init() { var inputs = document.querySelectorAll('input.voice-input'); for (var i = 0; i < inputs.length; i++) { initVoiceInput(inputs[i]); } } if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', init); } else { init(); } })();