У меня есть форма входа, когда страница открывается, Chrome автоматически заполняет учетные данные. Однако событие onChange из input элементов не запускается.
Щелчок в любом месте страницы регистрирует их в атрибуте value элемента input, что нам и нужно. Пробовал делать event.target.click(), не помогло.
В onChange я устанавливаю значения в состояние, например:
this.setState({ email: event.target.value })
И кнопка отправки отключена, если email.length === 0.
Таким образом, даже если страница показывает, что учетные данные заполнены, кнопка отправки по-прежнему выглядит отключенной.
Поскольку щелчок в любом месте регистрирует значения, нажатие кнопки отправки также регистрирует их перед отправкой. Так что работает отлично.
Однако дело не во времени, поле никогда не заполняется. Когда я открываю консоль разработчика и проверяю, поле значения пусто, пока я не нажму где-нибудь.
Единственная проблема здесь заключается в том, что кнопка выглядит отключенной, потому что значение ввода электронной почты пусто, пока что-то не будет нажато. Есть ли хакерское решение для этого?
Если вы отключите базовые функции, вам также необходимо проверить их включение при запуске. Поэтому поместите где-нибудь проверку «if email.length» После того, как браузер полностью загрузит все данные, чтобы вы обнаружили, что ввод заполняется автоматически. Базовый тайм-аут может сработать.
Он никогда не заполняется. Когда я открываю консоль разработчика и проверяю, поле значения пусто, пока я не нажму где-нибудь.
Вы когда-нибудь решали это? У меня такая же проблема. Страница загружается, и вход (адрес электронной почты) заполняется, но значение входной ссылки пусто до тех пор, пока страница не взаимодействует (сделает щелчок), поэтому второй рендеринг в порядке. Я должен упомянуть, что это только в Chrome; Файрфокс работает нормально.
если вы можете предоставить код, было бы лучше
Просто используйте oninput, а также onchange
@bsmidtson, предоставивший обработчик oninput, а также onchange, помогли мне, как было предложено во втором ответе. Должен быть принятый ответ.
Я знаю, что это не решение описанной проблемы, но если у вас есть проблема с отправкой формы с автоматически заполненными значениями, сосредоточьтесь на вводе. После того, как пользователь нажмет кнопку отправки, браузер каким-то образом зарегистрирует автоматически заполненные значения с событием onchange/onblur.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Я создал пример приложения здесь https://codesandbox.io/s/ynkvmv16v
Это решит вашу проблему?
Нет, потому что e.target.value всегда пусто. В этом проблема.
Вы пытались зарегистрировать значение события? Ваш фрагмент кода выше очень неверен. event.target.email должен быть event.target.value. Кроме того, можете ли вы сказать мне версию вашего браузера, в которой вы столкнулись с этой проблемой?
Исправил ту опечатку. Chrome macOS 73.0.3683.75
Регистрировать какое значение события? onChange не запускается, поэтому события нет.
У меня такая же версия хрома, и я не нахожу проблему. Вы не против поделиться своим кодом через codeandbox.io?
Пожалуйста, предоставьте больше, чем внешнюю ссылку, чтобы увеличить ценность темы здесь. Ссылка может быть недоступна в будущем. Возможно, скопируйте простую версию вашего решения в свой ответ здесь. :)
event.target.click() будет «имитировать» щелчок и запускать события onClick(), но не будет действовать как физический щелчок в окне браузера.
Вы уже пробовали использовать focus() вместо (или в дополнение) click()? Вы можете попробовать сфокусироваться на своем элементе ввода, а затем проверить, установлено ли значение. Если это сработает, вы можете добавить this.setState({ email: event.target.value }) как к фокусу, так и к клику.
Не нужно запускать событие клика, я думаю, было бы лучше, если бы вы установили состояние email в componentDidMount вот так
this.setState({ email: document.getElementById('email').value })
поэтому после вызова componentDidMount() вы получите электронное письмо, заполненное Chrome, и обновите state, затем отобразите кнопку отправки и включите ее.
Подробнее о жизненном цикле React можно прочитать в этом связь.
Похоже, проблема возникает после рендеринга, поэтому проверка componentDidMount может не иметь значения. Надеюсь, ОП сможет взвесить и дать нам некоторую ясность.
Установка отладчика внутри useEffect, .value ввода электронной почты пуста, и useEffect не срабатывает во второй раз (параметр массива опущен) после того, как Chrome заполнит ввод. Только когда я взаимодействую со страницей (вызывая рендеринг), useEffect срабатывает во второй раз и может обнаружить значение в поле электронной почты, которое было помещено в Chrome.
Ответ будет заключаться в том, чтобы либо отключить автозаполнение для формы, используя autocomplete="off" в вашей форме, либо опросить через регулярные промежутки времени, чтобы увидеть, заполнена ли она.
The problem is autofill is handled differently by different browsers. Some dispatch the change event, some don't. So it is almost impossible to hook onto an event which is triggered when browser autocompletes an input field.
Change event trigger for different browsers:
For username/password fields:
- Firefox 4, IE 7, and IE 8 don't dispatch the change event.
- Safari 5 and Chrome 9 do dispatch the change event.
For other form fields:
- IE 7 and IE 8 don't dispatch the change event.
- Firefox 4 does dispatch the change change event when users select a value from a list of suggestions and tab out of the field.
- Chrome 9 does not dispatch the change event.
- Safari 5 does dispatch the change event.
You best options are to either disable autocomplete for a form using
autocomplete = "off"in your form or poll at regular interval to see if its filled.For your question on whether it is filled on or before document.ready again it varies from browser to browser and even version to version. For username/password fields only when you select a username password field is filled. So altogether you would have a very messy code if you try to attach to any event.
You can have a good read on this HERE
Взгляните на эту тему: Обнаружение автозаполнения браузера
Ссылка Good Read недоступна
Я наткнулся на эту проблему, потому что у меня была такая же проблема. Не в React, но проблема универсальная. Может быть, это поможет любому, кто наткнется на это.
Ни один из других ответов на самом деле не отвечает на проблему. Проблема, описанная OP, заключается в том, что Chrome не устанавливает значение входов до момента взаимодействия пользователя со страницей. Это может быть щелчок по странице или даже ввод случайных вещей в консоль.
После взаимодействия с пользователем устанавливаются значения входов и запускается событие изменения.
Вы даже можете увидеть это визуально, так как стиль автозаполненного текста отличается при первом представлении и меняется на стиль ввода после взаимодействия.
Кроме того: запуск щелчка или установка фокуса или что-то еще из кода не помогает, только реальное человеческое взаимодействие.
Таким образом, опрос значения не является решением, потому что значение останется пустым, если страница не будет нажата. Также заявление о том, что вы не можете полагаться на событие изменения, на самом деле не имеет значения, поскольку событие является правильно срабатывает при отложенной установке значения. Проблема в неопределенной задержке.
Однако вы можете опросить наличие псевдоклассов CSS Chrome. В Chrome 83 (июнь 2020 г.) это :-internal-autofill-selected и :-internal-autofill-previewed. Однако они регулярно меняются. Кроме того, они не присутствуют непосредственно после рендеринга. Поэтому вы должны установить достаточный тайм-аут или опросить его.
Небрежный пример в ванильном JavaScript:
var input = document.getElementById('#someinput');
setTimeout(() => {
if (input.matches(':-internal-autofill-selected')) {
/* do something */
}
}, 500);
Вы все еще не можете получить значение на данный момент, поэтому в этом отношении это все еще не решает проблему, но, по крайней мере, вы можете включить кнопку отправки на основе наличия автоматически заполненных данных (как хотел сделать ОП). Или сделать что-то другое визуальное.
как насчет того, что сказал Кибер Вальдес, используйте oninput! работал сразу для меня.
@JessePepper Нет, oninput ведет себя так же, как onchange (в настоящее время тестируется в Chrome 90), поскольку он срабатывает только после взаимодействия с пользователем (проблема OP). Мой ответ по-прежнему является единственным ответом, который решает эту проблему и предлагает какое-то решение проблемы ОП. Не могли бы вы вернуть невостребованное понижение? Спасибо.
Мне нравится этот ответ от Карима. Я укажу, будьте осторожны, если у вас другое/конкурирующее поведение «автозаполнения». Когда автозаполнение Google Chrome работало, я получил «переключение шрифта» / ожидание щелчка пользователя, как описал Карим. (i.stack.imgur.com/uvwqs.gif) Когда работало автозаполнение расширения LastPass; Я получил правильный шрифт и событие valueChange. (i.stack.imgur.com/D3QhJ.gif)
Кроме того, давайте вспомним разницу между автозаполнение против автозаполнения; как говорит Карим, этот вопрос касается автозаполнение (автозаполнение подразумевает некоторое взаимодействие с пользователем). И, наконец, как указывает Карим, псевдокласс CSS может измениться; в 2017 году кажется, что люди запрос для псевдокласса CSS :-webkit-autofill (но теперь, пожалуйста, посмотрите, как Карим использует :-internal-autofill-selected)
Еще один момент, как говорит Карим, даже если вы опрашиваете/отслеживаете псевдокласс CSS, это не означает, что вход имеет значение (даже если вход появляется имеет значение); Карим говорит: «Вы все еще не можете получить значение... так что это все еще не решает проблему». Это было верно для меня - моему приложению требуется входное значение для поиска. поэтому у меня не было выбора но ждать, пока пользователь нажмет на странице. Я не мог успешно использовать autocomplete = "off" для отключения автозаполнения, если только я не стал агрессивным с [type = "search"](stackoverflow.com/a/30873633/1175496) (используется как для имени пользователя, так и для пароля а также)
Использование oninput вместо onchange поможет.
Не знаю, почему это не лучший ответ!
Потому что это не ответ на проблему ОП. oninput (как и onchange) срабатывает только после взаимодействия с пользователем. Это была проблема ОП, и она не решается с помощью oninput.
Это не работает
Если данные заполняются в форме с помощью автозаполнения, и вы пытаетесь отправить форму напрямую, браузер, такой как firefox, не принимает входные данные, потому что он не находится в состоянии этого ввода.
Но мы можем решить эту проблему с помощью хука useEffect или в componentDidMount, если вы используете компонент на основе классов.
useEffect(() => {
setUserName(document.getElementById('username').value);
}, [])
setUserName здесь — метод установки состояния, замените его своим. Измените имя пользователя на идентификатор поля ввода.
Вы можете опубликовать ссылку на jsfiddle? Это было бы большим подспорьем.