Получение списка голосов в speechSynthesis of Chrome (Web Speech API)

Следующий 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 Тригер?

Похоже хром загружает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);

Ответы на вопрос(10)

Ваш ответ на вопрос