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

31 просмотр

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

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

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

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

Всем привет! Имеется функция: function IsValidChar(ch: UTF8Char): Boolean; var i: Integer; ValidChars: AnsiString; begin ValidChars := 'abcdefghijklmnopqrstuvwxyzABCDE...
Евгений
44
лучше скажите, причём тут паскаль?
Alexey Kulakov
36
Чтобы перехватить все нажимания буков на форме, надо хук ставить? Пробовал на форме ОнКейДаун, оно ловит клаву если фокус не на компоненте с вводом текста
Serjone
15
Народ! Впервые клиенту пришло письмо от РКН, у вас, дескать, есть яндекс метрика, а нигде не написано, что вы ее юзаете. Никто не сталкивался?
Sasha Beep
14
Всем привет! вывожу на общей стр дочерние ресурсыв каждом ресурсе галерея, и первая фотка должна выводиться на общей [!DocLister? &prepare=photo !]
Alekso
12
А можно вопрос? Мне сегодня сказали что у меня функция (которая просто заполняет массив значениями) не правильная void Full(double * arr, int n) { for (int i = 0; i < n; i...
† C E †
7
День добрый, подскажите пожалуйста, есть ли какой-то способ сказать ребару не компилировать определённое приложение? Всю доку их перечиатл ничего подобного не нашёл
Кирилл
14
Добрый вечер. Хочу чтобы у меня в классе поле было функцией, которая возвращает строку. Делаю так: interface ... TGetOutPath = function : String of object; ... protec...
Kirill Filippenok
12
Здравствуйте, хочу сделать HelloWorld в консоли Дельфи, но функция API ничего не выводит, что я делаю не так? program Hello; {$APPTYPE CONSOLE} uses System.SysUtils, WinAPI.Wi...
Sergey Vinogradov
20
Это может быть все-таки не флудвейт? у меня ботфазер принимает изменения и отображает даже что они изменились, на видео видно что он прислал якобы уже измененное описание, н...
OVERLINK
13
Карта сайта