Следующий 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);