#reactjs #autocomplete #material-ui #autofill
#reactjs #автозаполнение #материал-пользовательский интерфейс
Вопрос:
У меня есть приложение ReactJS, созданное с использованием пользовательского интерфейса Material.
Целевыми браузерами являются Chrome и Microsoft Edge, как последняя версия, так и две последние версии (всего 3 версии).
Чего я хочу добиться:
Отключите автозаполнение и автозаполнение для полей ввода текста.
Я долго искал, но не мог найти рабочего решения.
Что я пробовал до сих пор:
- Автозаполнение={«выкл.»}
- Автозаполнение={«false»}
- Автозаполнение={«xyz»} так что автозаполнение с пользовательским значением
- Автозаполнение =»новый пароль»> но это не работает в Edge
- Реализация решения, которое добавляет атрибут HTML только для чтения к каждому полю ввода в начале, удаляет его при фокусировке и снова добавляет его в размытие текстового поля. Это не работает и, кроме того, приводит к дефекту, из-за которого переход к другому вводу текста с помощью табулятора на клавиатуре больше невозможен.
Для меня это не решение, заключать каждое поле в <form>
элемент.
Рад видеть подход к решению этой проблемы.
Комментарии:
1. на самом деле имя атрибута является автозаполнением в react с большой буквы C попробуйте изменить имя атрибута
2. @angelo Спасибо. Мне известно о том, что атрибут записывается как «Автозаполнение» в ReactJS.
3. @Gutelaunetyp Пожалуйста, предоставьте изолированную среду с кодом , воспроизводящую вашу проблему, показывающую, как вы пытались решить 1 из вашего вопроса.
4. Для Chrome мне пришлось добавить это <автозаполнение ввода = «chrome-off» />
5. Просто попробуйте: github.com/terrylinooo/disableautofill.js
Ответ №1:
Одним из возможных решений является установка уникального атрибута name для каждого времени <TextField>
отображения. Например:
<TextField
{...textFieldProps}
label={label}
name={`${label}${Date()}`}
/>
Поведение автозаполнения и автозаполнения, на которое вы ссылаетесь, — это современные браузеры, пытающиеся быть «умными» и запоминать прошлые вводы пользователя, чтобы сэкономить им время. Возможно, вы заметили это поведение при просмотре веб-страниц, где один ввод текста «запоминает» ваш ввод с другого сайта. Когда это происходит, это происходит потому, что оба элемента имеют одинаковое значение для атрибута name . В вашем случае такое поведение «памяти» нежелательно.
Хотя это решение работает, Date
при каждом рендеринге создается новый объект, который не идеален; однако Date
он используется, поскольку обеспечивает уникальное имя вплоть до второго. Вероятно, есть пакеты, которые создают уникальные имена более эффективным способом.
Ответ №2:
Более подробно об автозаполнении можно прочитать здесь. Проблема в том, что автозаполнение — это опора пользовательского интерфейса, а автозаполнение — собственный атрибут html.
Возможное решение — создать пользовательский компонент, не использующий Material Ui, где у вас больше контроля. Таким образом, я уверен, вам удастся отключить автозаполнение между браузерами.
Ответ №3:
Microsoft Edge игнорирует параметр автозаполнения. Есть обходные пути, но они хакерские.
Итак, Microsoft Edge выполняет регулярное выражение в label> name, чтобы привязать ввод к автозаполнению. Из-за этого вы не можете использовать «стандартные» метки для этого.
Не зная всех шаблонов, которым он соответствует, я бы сказал, что самое простое решение — просто очистить его после автозаполнения. Если вы знаете шаблоны, вы можете избежать этого и создать пользовательское текстовое поле, чтобы избежать случаев автозаполнения Edge.
Что касается последнего пункта, это более сложное решение, но оно выполнимо с помощью логики. Вам нужно будет создать компонент-оболочку вокруг ваших полей ввода текста (TextField). Это проверяет, когда компонент сфокусирован, а затем удаляет реквизит только для чтения.
Комментарии:
1. Привет @neon, спасибо за ваш ответ. Проблема заключается не только в автозаполнении, но и в автозаполнении. Я не хочу иметь всплывающее раскрывающееся меню, предлагающее значения для поля. Поэтому очистка текстового поля не является решением. Что касается решения 5 (добавление и удаление атрибута только для чтения): Я это реализовал, и это не так сложно. Но это не работает. Кроме того, он уничтожает функцию табуляции между полями ввода.