fix: 移动端朗读改为同步手势触发并兼容cancel后延迟播放
This commit is contained in:
@@ -1,5 +1,6 @@
|
|||||||
var speechVoices = [];
|
var speechVoices = [];
|
||||||
var speechVoicesLoaded = false;
|
var speechVoicesLoaded = false;
|
||||||
|
var speechTimer = null;
|
||||||
|
|
||||||
function refreshSpeechVoices() {
|
function refreshSpeechVoices() {
|
||||||
if (!window.speechSynthesis) return;
|
if (!window.speechSynthesis) return;
|
||||||
@@ -36,28 +37,20 @@ function buildSpeechUtterance(text, lang) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function doSpeak(text, lang) {
|
function doSpeak(text, lang) {
|
||||||
if (!window.speechSynthesis || !text) return;
|
if (!window.speechSynthesis || !window.SpeechSynthesisUtterance || !text) return;
|
||||||
window.speechSynthesis.cancel();
|
window.speechSynthesis.cancel();
|
||||||
window.speechSynthesis.speak(buildSpeechUtterance(text, lang));
|
if (speechTimer) clearTimeout(speechTimer);
|
||||||
|
var utterance = buildSpeechUtterance(text, lang);
|
||||||
|
speechTimer = setTimeout(function() {
|
||||||
|
window.speechSynthesis.speak(utterance);
|
||||||
|
if (window.speechSynthesis.paused) window.speechSynthesis.resume();
|
||||||
|
}, 60);
|
||||||
}
|
}
|
||||||
|
|
||||||
function speakText(text, lang) {
|
function speakText(text, lang) {
|
||||||
if (!text || !window.speechSynthesis) return;
|
if (!text || !window.speechSynthesis) return;
|
||||||
refreshSpeechVoices();
|
refreshSpeechVoices();
|
||||||
if (speechVoicesLoaded) {
|
doSpeak(text, lang);
|
||||||
doSpeak(text, lang);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var attempts = 0;
|
|
||||||
var timer = setInterval(function() {
|
|
||||||
attempts++;
|
|
||||||
refreshSpeechVoices();
|
|
||||||
if (speechVoicesLoaded || attempts >= 8) {
|
|
||||||
clearInterval(timer);
|
|
||||||
doSpeak(text, lang);
|
|
||||||
}
|
|
||||||
}, 80);
|
|
||||||
window.speechSynthesis.getVoices();
|
window.speechSynthesis.getVoices();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -71,3 +64,12 @@ function initSpeech() {
|
|||||||
|
|
||||||
if (document.readyState === 'complete') initSpeech();
|
if (document.readyState === 'complete') initSpeech();
|
||||||
else document.addEventListener('DOMContentLoaded', initSpeech);
|
else document.addEventListener('DOMContentLoaded', initSpeech);
|
||||||
|
|
||||||
|
function warmSpeechVoices() {
|
||||||
|
if (!window.speechSynthesis) return;
|
||||||
|
window.speechSynthesis.getVoices();
|
||||||
|
refreshSpeechVoices();
|
||||||
|
}
|
||||||
|
|
||||||
|
document.addEventListener('touchstart', warmSpeechVoices, { once: true, passive: true });
|
||||||
|
document.addEventListener('pointerdown', warmSpeechVoices, { once: true, passive: true });
|
||||||
|
|||||||
Reference in New Issue
Block a user