169 похожих чатов

Здравствуйте, мне дали задание добавить озвучку ко всем текстам на

всех страницах при ховере. Хотел спросит правильна ли я это сделал и будет ли это влиять на производительность?

Через querySelectorAll получаю весь текст с атрибутом t-speech и даю всем event listener "mouseenter" при ховере беру текст и с помощью speechSynthesis озвучиваю их. Все это находится в _app.tsx

Вот код:
const textToSpeech = (msg: string, locale: string) => {
let speech = new SpeechSynthesisUtterance();

speech.lang = locale;
speech.text = msg;
speech.volume = 1;
speech.rate = 1;
speech.pitch = 1;

window.speechSynthesis.speak(speech);
};

const cancelToSpeech = () => {
window.speechSynthesis.cancel();
};

const App = ({ Component, pageProps }: AppProps) => {
const router = useRouter();
const locale = router.query.locale;

const onMouseEnter = (item: Element) => {
textToSpeech(item.textContent ?? "", locale?.toString() ?? "ru");
};

useEffect(() => {
const speechTextList = document.querySelectorAll("[t-speech=true]");

speechTextList.forEach((item) => {
item.addEventListener("mouseenter", () => onMouseEnter(item));
item.addEventListener("mouseleave", cancelToSpeech);
});

return () => {
speechTextList.forEach((item) => {
item.removeEventListener("mouseenter", () => onMouseEnter(item));
item.removeEventListener("mouseleave", cancelToSpeech);
});
};
}, [router.asPath]);

12 ответов

34 просмотра

removeEventListener не делает абсолютно ничего

могу сказать как ускорить процесс удаления

Саид
убрать?

исправить

Саид
убрать?

у тебя не срабатывают они

Саид- Автор вопроса

Здравствуйте! Ваш подход к реализации функции озвучки текста при наведении мыши кажется довольно прямолинейным и понятным. Вы создали функцию textToSpeech, которая инициирует произнесение текста, и cancelToSpeech, которая прекращает произношение. После этого вы используете эти функции в обработчиках событий mouseenter и mouseleave для элементов, которые поддерживают озвучку. Однако, есть несколько моментов, которые стоит учесть: 1. Перформанс: Ваш текущий подход может влиять на производительность, особенно если на странице много элементов, к которым привязаны обработчики событий. Каждый обработчик создаёт дополнительную нагрузку. Если элементов много, это может привести к замедлению работы страницы, особенно на устройствах с ограниченными ресурсами. 2. Утечки памяти: Важно правильно очищать обработчики событий при размонтировании компонента, чтобы избежать утечек памяти. В вашем случае вы используете анонимные функции в addEventListener и removeEventListener, что делает их фактически разными функциями. Вместо этого нужно использовать именованные функции или сохранить ссылку на анонимную функцию. 3. Доступность: Не забывайте о доступности, так как не все пользователи могут захотеть или смогут воспользоваться озвучкой. Хорошей практикой будет предоставить возможность отключить эту функцию. 4. Оптимизация: Подумайте об оптимизации добавления и удаления обработчиков событий. Например, можно использовать делегирование событий, чтобы уменьшить общее количество обработчиков. 5. Проверка поддержки: Убедитесь, что API речевого синтеза поддерживается во всех целевых браузерах. 6. Обработка ошибок: Логика обработки ошибок может быть полезна для уведомления пользователя, если что-то пошло не так с функцией озвучки. 7. Частота вызовов: Если пользователь быстро наводит мышь на разные элементы, это может вызывать множество вызовов speechSynthesis.speak(). Можно рассмотреть оптимизацию этого аспекта, например, добавив задержку перед началом озвучивания. В целом, важно тестировать такие функции на разных устройствах и в разных условиях для обеспечения стабильной работы и хорошего пользовательского опыта.

кину тогда вариант с сигналом чтоб точно увидели его преимущества const textToSpeech = (msg: string, locale: string) => { let speech = new SpeechSynthesisUtterance(); speech.lang = locale; speech.text = msg; speech.volume = 1; speech.rate = 1; speech.pitch = 1; window.speechSynthesis.speak(speech); }; const cancelToSpeech = () => { window.speechSynthesis.cancel(); }; const App = ({ Component, pageProps }: AppProps) => { const router = useRouter(); const locale = router.query.locale; const onMouseEnter = (item: Element) => { textToSpeech(item.textContent ?? "", locale?.toString() ?? "ru"); }; useEffect(() => { const controller = new AbortController(); const signal = controller.signal; const speechTextList = document.querySelectorAll("[t-speech=true]"); speechTextList.forEach((item) => { item.addEventListener("mouseenter", () => onMouseEnter(item), { signal }); item.addEventListener("mouseleave", cancelToSpeech, { signal }); }); return () => { controller.abort(); }; }, [router.asPath]);

Саид- Автор вопроса
Sergey Sova
Здравствуйте! Ваш подход к реализации функции озву...

спасибо за ответ на счет доступности я еще думаю как его сделать пока решение не нашел но это обязательно будет

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта