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 ответов

24 просмотра

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
Здравствуйте! Ваш подход к реализации функции озву...

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

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

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

Вопрос по диагностике ошибок (я знаю в чем, в данном конкретном примере, я знаю, как исправить, пример модельный, понятно, что в реальности бывает намного запутаннее). module...
ⰄⰎⰋⰐⰐⰑⰛⰤⰧⰧⰩⰄ ⰊⰑⰁⰓⰡⰛⰦⰕⰫ
10
А чем вам питонисты не угодили?😂
.
79
Есть какой-нибудь для Delphi/FPC T*Compression(Decompression)Stream на базе LZ4/Zstd/любой другой быстрый(и хорошо сжимающий) алгоритм А ещё лучше в pure pascal А ещё лучше од...
notme
48
Есть предложения, как подобное можно упростить?
Hemul GM
12
type TObj = object procedure Init; virtual; end; TObj1 = object(TObj) procedure Init; override; end; procedure TObj1.Init; begin inherited; end; procedur...
Alexander 👋
29
У меня вопросик назрел. Почему, создав класс без наследования и реализации деструктора Destroy, деструктор не вызывался при free. Потом указал наследование от tobject и overri...
Сергей Бычков
9
Такой вопросец - есть функция function MySuperDuperConcat(const a: array of AnsiString): AnsiString; Как мне в её теле сделать вот так? Result:=Concat(a); А не грустный вариан...
notme
15
just use free version ?? pycharm has a free version
Fan / Ac
9
Всем привет, написал код ниже, но он выдает сегфолт, в чем причина? #include <stdio.h> #include <stdlib.h> #include <string.h> struct product { char *name; float price; };...
buzz базз
86
Привет, не могли бы подсказать почему "A tree falls in a forest" не отображается в journalctl? openlog ("exampleprog", LOG_CONS | LOG_PID | LOG_NDELAY, LOG_LOCAL1); syslog (LO...
•_• Asmanov 🎓
3
Карта сайта