Следующий HTML-код показывает пустой массив в консоли при первом щелчке:
<!DOCTYPE html>
<html>
<head>
<script>
function test(){
console.log(window.speechSynthesis.getVoices())
}
</script>
</head>
<body>
<a href="#" onclick="test()">Test</a>
</body>
</html>
Во втором клике вы получите ожидаемый список.
Если вы добавляете событие onload для вызова этой функции (<body onload="test()">), вы можете получить правильный результат при первом щелчке. Обратите внимание, что первый вызов onload по-прежнему не работает должным образом. Он возвращает пустое значение на странице, но потом работает.
Вопросы:
Поскольку в бета-версии может быть ошибка, я отказался от вопросов "Почему".
Теперь возникает вопрос, хотите ли вы получить доступ к window.speechSynthesis при загрузке страницы:
- Какой лучший взлом для этой проблемы?
- Как вы можете убедиться, что он загрузит
speechSynthesis, при загрузке страницы?
Фон и тесты:
Я тестировал новые функции в Web Speech API, затем я попал в эту проблему в свой код:
<script type="text/javascript">
$(document).ready(function(){
// Browser support messages. (You might need Chrome 33.0 Beta)
if (!('speechSynthesis' in window)) {
alert("You don't have speechSynthesis");
}
var voices = window.speechSynthesis.getVoices();
console.log(voices) // []
$("#test").on('click', function(){
var voices = window.speechSynthesis.getVoices();
console.log(voices); // [SpeechSynthesisVoice, ...]
});
});
</script>
<a id="test" href="#">click here if 'ready()' didn't work</a>
Мой вопрос: почему window.speechSynthesis.getVoices() возвращает пустой массив, после загрузки страницы и запускается функция onready? Как вы можете видеть, если вы нажмете на ссылку, то такая же функция возвращает массив доступных голосов Chrome onclick triger?
Кажется, Chrome загружает window.speechSynthesis после загрузки страницы.
Проблема не в событии ready. Если я удалю строку var voice=... из функции ready, для первого щелчка она показывает пустой список в консоли. Но второй щелчок работает нормально.
Кажется, что window.speechSynthesis требуется больше времени для загрузки после первого вызова. Вам нужно позвонить ему дважды! Но также, вам нужно подождать и допустить его до второго вызова window.speechSynthesis. Например, следующий код показывает два пустых массива в консоли, если вы запустили его в первый раз:
// First speechSynthesis call
var voices = window.speechSynthesis.getVoices();
console.log(voices);
// Second speechSynthesis call
voices = window.speechSynthesis.getVoices();
console.log(voices);

