英文:
Text input autocomplete forces 2 clicks
问题
这是您提供的React登录表单的部分代码。在这个表单中,问题出现在Chrome自动填充的时候。首先,当点击用户名字段时,您会得到Chrome的普通自动填充,而不是建议自动填充密码。只有在填写用户名字段后,再次点击时,您才会得到填写密码的建议,但这也会导致密码输入失去所有样式。
英文:
I have a very simple login form in React.
I don't think the React component code itself is the issue, but I'll add it here for clarity:
import React, { ChangeEvent, useState, useEffect } from "react"
import axios from "axios";
import { useNavigate } from 'react-router-dom';
import classnames from "classnames";
import "./Login.scss";
export default function Login() {
    const [user, setUser] = useState('');
    const [password, setPassword] = useState('');
    const [canSubmit, setCanSubmit] = useState(false);
    const navigate = useNavigate();
    useEffect(() => {
        setCanSubmit(!!user && !!password)
    }, [user, password])
    const handleChange = (event: ChangeEvent<HTMLInputElement>) => {
        const { name, value } = event.target;
        if (name === "username") {
            setUser(value);
        } else {
            setPassword(value);
        }
    };
    const onSubmit = async e => {
        e.preventDefault();
        if (!canSubmit) {
            return;
        }
        try {
            await axios.post("/api/admin/login", {
                username: user,
                password
            });
        } catch (error) {
            alert("lol " + error);
            return;
        }
        navigate("/admin");
    };
    return <form onSubmit={onSubmit} autoComplete="on">
        <div className="login flex-column flex-align-items-center flex-align-self-center">
            <div className="title">LOGIN</div>
            <div className="field">
                <label htmlFor="username">Username</label>
                <input type="text" placeholder="Enter your username" value={user} name="username" onChange={handleChange} />
            </div>
            <div className="field">
                <label htmlFor="password">Password</label>
                <input type="password" placeholder="Enter your password" value={password} name="password" onChange={handleChange} />
            </div>
            <button type="submit" className={classnames({ 'disabled': !canSubmit })}>Login</button>
        </div>
    </form>
}
The inputs are styles like this: (it's SASS)
input {
  background-color: transparent;
  outline: none;
  border: none;
  padding-bottom: 10px;
  padding-left: 1.5rem;
  font-size: 1.3rem;
  box-sizing: border-box;
  box-shadow: inset 0px -3px 0px 0px rgba(187, 187, 187, 0.2);
  transition: box-shadow 0.2s ease-in;
  &:focus {
    box-shadow: inset 0px -3px 0px 0px rgba(34, 193, 195, 0.7);
    outline: none;
  }
  &:-webkit-autofill,
  &:-webkit-autofill:hover,
  &:-webkit-autofill:focus {
    color: white !important;
    background-color: #12130f !important;
  }
}
Initially, the form looks fine:
If I just type normally into the inputs, it looks great:
When clicking the username field, I'm getting Chrome's "normal" autocomplete, instead of a suggestion to autofill the password:
Only after the username field is filled, when I click again, I get the actual suggestion to fill in the password, which when clicked also causes the password input to lose all its styling:
答案1
得分: 1
Chrome没有将您的“用户名”和“密码”字段识别为凭据字段,因为您没有将“autocomplete”属性的值设置为“username”以用于“username”输入,也没有设置为“current-password”以用于“password”输入。
<input type="text" placeholder="输入您的用户名" value={user} name="username" onChange={handleChange} autoComplete="username" />
<input type="password" placeholder="输入您的密码" value={password} name="password" onChange={handleChange} autoComplete="current-password" />
另外,您可以通过使用CSS选择器来定位自动填充的输入字段并应用所需的样式来修复Chrome对表单字段样式的忽视。
input:-webkit-autofill {
  box-shadow: inset 0px -3px 0px 0px rgba(34, 193, 195, 0.7);
}
英文:
Chrome is not recognizing your "username" and "password" fields as credentials fields because you did not add the autocomplete attribute with the value "username" to the "username" input and "current-password" to the "password" input.
<input type="text" placeholder="Enter your username" value={user} name="username" onChange={handleChange} autoComplete="username" />
<input type="password" placeholder="Enter your password" value={password} name="password" onChange={handleChange} autoComplete="current-password" />
BTW you can fix Chrome's ignorance for your form field styles by using CSS selector to target the autofilled input fields and apply the desired styles.
input:-webkit-autofill {
  box-shadow: inset 0px -3px 0px 0px rgba(34, 193, 195, 0.7);
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。







评论