次の HTML は、最初のクリックでコンソールに空の配列を表示します。
<!DOCTYPE html>
<html>
<head>
<script>
function test(){
console.log(window.speechSynthesis.getVoices())
}
</script>
</head>
<body>
<a href="#" onclick="test()">Test</a>
</body>
</html>
2 回目のクリックで、予想されるリストが表示されます。
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
ページの読み込み後にChrome が読み込まれるようです。
問題はready
イベントではありません。var voice=...
関数から行を削除するready
と、最初のクリックでコンソールに空のリストが表示されます。しかし、2回目のクリックはうまくいきます。
window.speechSynthesis
最初の呼び出しの後、読み込みに時間がかかるようです。2 回呼び出す必要があります。ただし、 を 2 番目に呼び出す前に、待機してロードする必要もありますwindow.speechSynthesis
。たとえば、次のコードを初めて実行すると、コンソールに 2 つの空の配列が表示されます。
// First speechSynthesis call
var voices = window.speechSynthesis.getVoices();
console.log(voices);
// Second speechSynthesis call
voices = window.speechSynthesis.getVoices();
console.log(voices);