2015-01-05 5 views
1

Насколько я могу судить, событие, записанное в голосовании, не срабатывает в Safari, либо на Mac, либо в iOS. Также нечетно, он, похоже, не срабатывает в Chrome на iOS, но я предполагаю, что Chrome на iOS использует тот же механизм JavaScript, что и Safari.событие voiceschanged не запущено в Safari

Вот доказательство того, что я использовал для проверки: http://jsbin.com/gosaqihi/9/edit?js,console (взято из Getting the list of voices in speechSynthesis of Chrome (Web Speech API))

Я также пробовал с помощью addEventListener:

speechSynthesis.addEventListener("voiceschanged", function() { 
    var voices = speechSynthesis.getVoices(), 
     keys = Object.keys(voices[0]), 
     i, j; 

    document.write("<table border=1><tr>"); 

    for (i = 0; i < keys.length; i++) { 
     document.write("<td>" + keys[i] + "</td>"); 
    } 

    document.write("</tr>"); 

    for (i = 0; i < voices.length; i++) { 
     document.write("</tr>"); 
     for (j = 0; j < keys.length; j++) { 
      document.write("<td>" + voices[i][keys[j]] + "</td>"); 
     } 
     document.write("</tr>"); 
    } 

    document.write("<table>"); 
}, false); 

Оба подхода (onvoiceschanged, addEventListener) прекрасно работают в Chrome для Windows, Android и Mac, но не работает в Chrome для iOS и Safari для Mac и iOS. Насколько я могу судить, Safari просто не запускает событие с голосованием.

Усложняя вещи, у меня нет на самом деле каких-либо устройств Apple, поэтому мне пришлось понять это, попросив друзей попробовать что-то.

Есть ли что-то особенное в Safari, чтобы получить список голосов? Или API-интерфейс Speech Synthesis просто не реализован (полностью)?

ответ

3

Apparently У Safari только частичная поддержка API Web Speech.

Что вы можете сделать, чтобы ваш код работал в разных средах, это определить, существует ли onvoiceschanged в speechSynthesis. Если нет, вы можете просто позвонить speechSynthesis.getVoices(), не прослушивая onvoiceschanged.

function doVoices() { 
    var voices = speechSynthesis.getVoices(), 
    // ... 
} 

if ('onvoiceschanged' in speechSynthesis) { 
    speechSynthesis.onvoiceschanged = doVoices; 
} else { 
    doVoices(); 
} 
+0

Спасибо. Хотелось бы, чтобы это было где-то лучше документировано. : / – Asmor

 Смежные вопросы

  • Нет связанных вопросов^_^