Самодельный преобразование текста в речь в javascript не работает должным образом

Мы сделали функцию преобразования текста в речь на javascript. Единственная проблема сейчас в том, что он не работает должным образом. Когда кнопка воспроизведения нажата, предполагается, что она расскажет все, что находится внутри тегов body. Проблема в том, что в большинстве случаев он не работает, а когда работает, он также сообщает коду javascript, который находится за пределами тега body. Как я могу это исправить, чтобы он работал каждый раз, когда нажимается кнопка воспроизведения, и рассказывал все только в теге body?

onload = function() {
  if ('speechSynthesis' in window) with(speechSynthesis) {

    var playEle = document.querySelector('#play');
    var pauseEle = document.querySelector('#pause');
    var stopEle = document.querySelector('#stop');
    var flag = false;

    playEle.addEventListener('click', onClickPlay);
    pauseEle.addEventListener('click', onClickPause);
    stopEle.addEventListener('click', onClickStop);

    function onClickPlay() {
      if (!flag) {
        flag = true;
        utterance = new SpeechSynthesisUtterance(document.querySelector('body').textContent);

        utterance.lang = 'nl-NL';
        utterance.rate = 0.7;
        utterance.onend = function() {
          flag = false;
          playEle.className = pauseEle.className = '';
          stopEle.className = 'stopped';
        };
        playEle.className = 'played';
        stopEle.className = '';
        speak(utterance);
      }
      if (paused) {
        playEle.className = 'played';
        pauseEle.className = '';
        resume();
      }
    }

    function onClickPause() {
      if (speaking && !paused) {
        pauseEle.className = 'paused';
        playEle.className = '';
        pause();
      }
    }

    function onClickStop() {
      if (speaking) {
        stopEle.className = 'stopped';
        playEle.className = pauseEle.className = '';
        flag = false;
        cancel();

      }
    }

  }

  else { /* speech synthesis not supported */
    msg = document.createElement('h5');
    msg.textContent = "Detected no support for Speech Synthesis";
    msg.style.textAlign = 'center';
    msg.style.backgroundColor = 'red';
    msg.style.color = 'white';
    msg.style.marginTop = msg.style.marginBottom = 0;
    document.body.insertBefore(msg, document.querySelector('div'));
  }

}
<button id=play>Play</button>
<button id=pause>Pause</button>
<button id=stop>Stop</button>

Почему бы не поместить текст в div или textarea вместо того, чтобы читать содержимое тела?

mplungjan 30.04.2019 14:58

Даже если мы поместим его в div и прочитаем div, у нас все равно будет та же проблема.

D3nic3 30.04.2019 14:59

У меня работает, пока я нажимаю «Стоп» перед повторным воспроизведением. Я думаю, вам не хватает паузы = истина, и если (говоря)

mplungjan 30.04.2019 15:07

То же, что @mplungjan. Проблема с чтением кода возникает, когда ваш код находится в body, что также вполне ожидаемо.

Sébastien Renauld 30.04.2019 15:08
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
4
205
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Это должно быть очень просто. Я вижу в вашей строке, что вы запрашиваете все содержимое основного текста, но это не должно быть так. Перейдите в консоль JS и запросите: document.querySelector('body').textContent

Вы должны точно видеть, что вы передаете в качестве аргументов:

произнесение = новый SpeechSynthesisUtterance(document.querySelector('body').textContent);

Итак, теперь дело за вами, вам придется отфильтровать то, что вы хотите прочитать, поместив это в определенный DIV или удалив HTML со страницы в соответствии со сложной логикой, сохранив только то, что вы хотите прочитать.

Простите... Вы должны добавить console.info(document.querySelector('body').textContent); прямо перед строкой: utterance = new SpeechSynthesisUtterance(document.querySelector('body').text‌​Content); Для того, чтобы посмотреть, что вы передаете функции (только Play Pause и Stop).

Daniel Almeida 30.04.2019 15:46
Ответ принят как подходящий

Определите DIV, из которого вы хотите, чтобы распознавание речи читалось:

</head>
<body>
    <div>
        <button id=play>Play</button>
        <button id=pause>Pause</button>
        <button id=stop>Stop</button>
    </div>
    <div id = "readFrom">
        Just a test o my friend mplungjan
    </div>

    <script type = "text/javascript">
        window.onload = function () {
            if ('speechSynthesis' in window)
                with (speechSynthesis) {

                    var playEle = document.querySelector('#play');
                    var pauseEle = document.querySelector('#pause');
                    var stopEle = document.querySelector('#stop');
                    var flag = false;

                    playEle.addEventListener('click', onClickPlay);
                    pauseEle.addEventListener('click', onClickPause);
                    stopEle.addEventListener('click', onClickStop);

                    function onClickPlay() {
                        if (!flag) {
                            flag = true;
                            utterance = new SpeechSynthesisUtterance(document.querySelector('#readFrom').innerHTML);

                            utterance.lang = 'nl-NL';
                            utterance.rate = 0.7;
                            utterance.onend = function () {
                                flag = false;
                                playEle.className = pauseEle.className = '';
                                stopEle.className = 'stopped';
                            };
                            playEle.className = 'played';
                            stopEle.className = '';
                            speak(utterance);
                        }
                        if (paused) {
                            playEle.className = 'played';
                            pauseEle.className = '';
                            resume();
                        }
                    }

                    function onClickPause() {
                        if (speaking && !paused) {
                            pauseEle.className = 'paused';
                            playEle.className = '';
                            pause();
                        }
                    }

                    function onClickStop() {
                        if (speaking) {
                            stopEle.className = 'stopped';
                            playEle.className = pauseEle.className = '';
                            flag = false;
                            cancel();

                        }
                    }

                }

            else { /* speech synthesis not supported */
                msg = document.createElement('h5');
                msg.textContent = "Detected no support for Speech Synthesis";
                msg.style.textAlign = 'center';
                msg.style.backgroundColor = 'red';
                msg.style.color = 'white';
                msg.style.marginTop = msg.style.marginBottom = 0;
                document.body.insertBefore(msg, document.querySelector('div'));
            }

        }
    </script>        
</body>

Другие вопросы по теме