Material-ui: [TextField] Автозаполнение форм не обновляет текст плавающей метки в текстовом поле

Созданный на 29 мая 2015  ·  75Комментарии  ·  Источник: mui-org/material-ui

Когда вы используете хром для автозаполнения текстовых полей, текст плавающей метки вообще не анимируется и не отображается (начиная с 0.8.0)

bug 🐛 TextField external dependency v0.x

Самый полезный комментарий

Если кто-то еще здесь, я просто установил эту опору InputLabelProps={{ shrink: true }} в текстовом поле, которое это произвело. Было лучшим решением для нашей команды.

Все 75 Комментарий

Вероятно, это хорошее место для начала ...

@illogikal не могли бы вы опубликовать

Ну вот:

image

Желтое выделение означает, что поля были заполнены автоматически. Как видите, пароль заполнен, но метка все еще на месте.

Мм, это интересно. @mbrookes Знаете ли вы, для всех типов ввода или только для ввода пароля?

Не уверен - я попытался поменять местами адрес и пароль, но автозаполнение не сработало ни для ввода известного пользователя / пароля, ни для сохранения нового. Мне нужно выяснить, как лучше всего протестировать другие области.

Хорошо, я планирую вернуться к рефакторингу некоторых элементов TextField в ближайшем будущем. Попробую тоже немного поэкспериментировать. Дай мне знать, если заметишь что-нибудь еще.

Здравствуйте! Мы столкнулись с этой проблемой. Есть ли что-нибудь, что мы можем сделать локально, чтобы попробовать и поэкспериментировать с некоторыми потенциальными исправлениями для этого? Или придется ждать рефакторинга?

У нас точно такая же проблема с полем пароля, указанным выше. В дополнение к этому у нас есть аналогичная проблема с простым TextField . У нас есть набор текста подсказки, который исчезает, если вы вводите значения. Однако, если мы устанавливаем значение при отображении страницы (глубокая ссылка), текст подсказки все еще виден позади фактического значения. Вероятно, это та же проблема или это будет что-то отдельное?

image

Вероятно, это та же проблема или это будет что-то отдельное?

Это похоже на другую проблему.

вдохновение для исправления: https://github.com/appsforartists/gravel/blob/master/src/components/Input.jsx#L208

этот код можно добавить в onChange чтобы обновить state.isAutofilled

Chrome версии 49.0.2623.87 (64-разрядная) OS X El Capitan

image

если нажата какая-либо клавиша или щелкн мышкой - плавает корректно, но начальная загрузка нарушена.

Точно такая же проблема:

s

Есть идеи, ребята?

Возникла та же проблема.

Есть ли способ отключить автозаполнение, работающее с MUI?

@ kand617

Просто создайте пару полей и сделайте их скрытыми с помощью « display: none ». Пример:



Затем поместите свои настоящие поля внизу.

http://stackoverflow.com/questions/15738259/disables-chrome-autofill

какое-либо решение для запуска события onChange?

@antoinerousseau Это будет объединено в мастере?

Это может быть аналогичная проблема (та же основная причина, другое проявление?)

Я не вижу упомянутых проблем с анимацией, но высота контейнера TextField не учитывает верхнее поле ввода. Это приводит к тому, что TextField расширяется на 14 пикселей ниже контейнера. Это довольно простой способ обхода, но я вижу его только с автозаполнением:

screen shot 2016-06-22 at 9 58 04 am
screen shot 2016-06-22 at 9 58 16 am
screen shot 2016-06-22 at 9 58 27 am
screen shot 2016-06-22 at 9 58 34 am

Скоро это будет исправлено;)

image

хороший @nathanmarks , спасибо !!

и нашли ли вы способ обновления плавающей метки при автозаполнении хрома без нажатия на страницу?

Это все еще довольно болезненный вопрос.

Я пробовал использовать vanilla-autofill-event, но это не сработало.

Я использую redux-form (как и многие другие), и я нашел уродливый обходной путь (только для моей формы входа, меня не интересуют другие формы).
Я тестировал его только в хроме, поэтому используйте его на рассмотрение.

Когда я добавил скрытые поля имени пользователя и пароля, хром игнорировал всю форму (если не скрывать их с помощью display: none, о котором хром не заботился).

Итак, я использовал 4 (: разочарованных:) дополнительных поля. 2, чтобы хром игнорировал мою форму (autocomplete = off не работал) и еще 2 в другой поддельной форме, чтобы заполнить хром, чем в componentDidMount. Я добавил тайм-аут, который скопировал значения из поддельных полей в настоящие с использованием redux событие изменения формы:

class Login extends Component {
  // This was tested under chrome only. It's ugly, but it works. Code was modified a bit for simplicity so it might not work out of the box.

  componentDidMount() {
    // Fix chrome auto-fill
    setTimeout(() => {
      const { change, dispatch }= this.props;
      if (this.refs.usernameAutoFill.value && ! this.refs.username.value) {
        dispatch(change('username', this.refs.usernameAutoFill.value));
      }
      if (this.refs.passwordAutoFill.value && !this.refs.password.value) {
        dispatch(change('password', this.refs.passwordAutoFill.value));
      }
    }, 500);
  }

  render() {
    const styles = {
      autofill: {
        height: 0,
        width: '1px',
        position: 'absolute',
        left: 0,
        top: 0
      }
    };

    return (
      <div>
        <form style={styles.autofill}>
          <input type="text" ref="usernameAutoFill" name="usernameAutoFill" />
          <input type="password" ref="passwordAutoFill" name="passwordAutoFill" />
        </form>
        <form autocomplete="off">
          <div style={styles.autofill}><input type="text" name="fakeusername" /><input type="password" name="fakepassword" /></div>
          <Field name="username" component={() => <TextField ref="username" name="username" floatingLabelText="Username" />}/>
          <Field name="password" component={() => <TextField ref="password" name="password" type="password" floatingLabelText="Password" />}/>
          <RaisedButton primary={true} label="Login" type="submit"/>
        </form>
      </div>
    )
  }
}
export default {
  Form: reduxForm({
    form: 'Login'
  })(Login)
}

Я изменил код для простоты, поэтому используйте его только для справки.

@ adamtal3 это autoComplete="off"

@justinko Это не имеет значения. Если вы используете autoComplete response изменит его на autocomplete .
Как видите, я использовал строковое значение ( "off" ), а не значение js ( {'off'} ).

Если вы имеете в виду стандарты и согласованность React, я согласен, но не думаю, что это имеет большое значение.

Это мое решение.

Сначала я проверил, заполняется ли имя пользователя автоматически, когда компонент монтировался.
Если да, я бы обновил состояние поля пароля.
Как только hasValue станет истинным, плавающая метка будет обновлена.

componentDidMount() {
    setTimeout(() => {
        if(this.refs.username.getValue()) {
            this.refs.password.setState({...this.refs.password.state, hasValue: true})
        }
    }, 100)
}

Надеюсь это поможет. :)

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

setTimeout (function () {
var autofilled = document.querySelectorAll ('введите # пароль: -webkit-autofill');
if (автозаполнено) {
$ ("ввод [тип = пароль]"). parent (). addClass ("грязный");
}
}, 500);
`
это должно быть внутри вашего документа, готового в конце.
class is-dirty - это класс, который запускает вашу плавающую метку.

Я использую redux-form с react-ui. Решение для меня - разместить поддельный ввод сразу после необходимого ввода.

  <TextField
     {...password}
     type="password"
     placeholder={formatMessage(messages.loginPasswordPlaceholder)}
     disabled={submitting}
   />
   <Icon name="password" className={theme.icon}/>
   <input className={theme.hiddenInput} type="password" />

Мы надеемся, что React 16 исправит это: https://github.com/facebook/react/issues/7211#issuecomment -266774957

Та же проблема случилась со мной, когда я обновился с 0.17.1 до 0.18.1

Исправьте, что сработало для меня:

class FixedTextField extends Component {
    constructor() { 
       super()
       this.state = { value: '' } }
    }
    textfield = null

    componentDidMount() {
        requestAnimationFrame(() => {
            this.setState({ value: this.textfield.getInputNode().value })
        })
    }
    render() {
       return <TextField {...this.props} value={this.state.value} />
    }
}

Задний порт исправления только что был выпущен в React 15.6.0 . Кто-нибудь может проверить, решает ли он эту проблему?

[К сведению: сообщение «Я тоже» выше будет удалено - пожалуйста, используйте кнопки голосования, а не пульсируйте обсуждение.].

@mbrookes Не исправлено, как я тестировал.

@ Stupidism Подробности?

Прямо как тот, который вы разместили 2 года назад. https://github.com/callemall/material-ui/issues/718#issuecomment -167445748

@Stupidism Какая версия Material-UI, какая версия React, какой браузер / версия?

  "name": "material-ui",
  "version": "0.18.3",
  "name": "react",
  "version": "15.6.0",



md5-f7a2844706b5476282e07a6c64e29edb



Google Chrome   59.0.3071.86 (Official Build) (64-bit)
OS  Linux
JavaScript  V8 5.9.211.31

image

: man_shrugging: В этом случае обходной путь @ whtang906 кажется лучшим вариантом на данный момент.

Для redux-формы


  constructor(props) {
    super(props);

    // This binding is necessary to make `this` work in the callback
    this.refUsername = this.refUsername.bind(this);
    this.refPassword = this.refPassword.bind(this);
  }

  componentDidMount() {
    setTimeout(() => {
      if(this.usernameRef.getValue()) {
        this.passwordRef.setState({...this.passwordRef.state, hasValue: true});
      }
    }, 100)
  }

  refUsername(component) {
    this.usernameRef = component.getRenderedComponent().refs.component;
  }
  refPassword(component) {
    this.passwordRef = component.getRenderedComponent().refs.component;
  }


            <Field
              name="username"
              withRef
              ref={this.refUsername}
              component={TextField}
            />

            <Field
              name="password"
              type="password"
              withRef
              ref={this.refPassword}
              component={TextField}
            />

Мое приложение работает немного медленнее, поэтому я добавил страховку

  componentDidMount() {
    let times = 0;
    const interval = setInterval(() => {
      times += 1;
      if(this.usernameRef.getValue()) {
        this.passwordRef.setState({...this.passwordRef.state, hasValue: true});
        clearInterval(interval);
      } else if (times >= 10) {
        clearInterval(interval);
      }
    }, 100)
  }

Не удается получить значение из хромированного автоматически заполненного поля пароля
https://stackoverflow.com/questions/35049555/chrome-autofill-autocomplete-no-value-for-password

Поскольку я играл с веткой v1-beta, проблема была исправлена. Это может быть переписывание или обновление реакции. Я закрываюсь, пока мы не услышим об этом больше. Спасибо за обсуждение здесь!

image
Ошибка все еще существует ...
[email protected]
[email protected]
Хром 60.0.3112.90

@artalar Просто попробуйте componentDidMount решение O (∩_∩) O

@Stupidism Спасибо за решение! Я пробовал все вышеперечисленное, и ни одно из них не помогло. Может потому, что большинству из них 1-2 года ...
Кстати, эта ошибка возникает только в Chrome, с Firefox все в порядке :)

@ Иван-Парушев Я думаю, это потому, что изменилось использование ref. Так решена твоя проблема или нет?

Здесь не решено, я заполняю значения из localStorage, если они существуют на componentDidMount, и такая же ошибка со всеми последними версиями.

Все еще ждем исправления ...

Я блокирую нить. Этому выпуску 2 года. Поскольку сейчас мы сосредоточены на ветке v1-beta. Если у кого-то есть пример воспроизведения, пожалуйста, откройте новый выпуск для ветки v1-beta.

Прошло уже 3 года. Эта проблема все еще существует с последними версиями пользовательского интерфейса react и material.

@tschaub Ха-ха, вроде ввода с фиксированной позицией в ios возникает целенаправленная проблема.

@tsmirnov Пора тебе застрять и исправить. 😜

Для этой ошибки есть решение css

// Selects label that comes right after the autofilled input
input:-webkit-autofill + label {
    // Insert your active label styles
}

Ну вот:

image

Желтое выделение означает, что поля были заполнены автоматически. Как видите, пароль заполнен, но метка все еще на месте.

Я столкнулся с той же проблемой.

Для этой ошибки есть решение css

// Selects label that comes right after the autofilled input
input:-webkit-autofill + label {
    // Insert your active label styles
}

Не могли бы вы объяснить, что это значит?

Для этой ошибки есть решение css

// Selects label that comes right after the autofilled input
input:-webkit-autofill + label {
    // Insert your active label styles
}

Не могли бы вы объяснить, что это значит?

: -webkit-autofill выбирает автоматически заполняемые поля браузером. Поместите свою метку рядом с входом и выберите его с помощью селектора: -webkit-autofill. Если вам нужна дополнительная помощь, поделитесь своей текущей структурой html.

Для этой ошибки есть решение css

// Selects label that comes right after the autofilled input
input:-webkit-autofill + label {
    // Insert your active label styles
}

Не могли бы вы объяснить, что это значит?

: -webkit-autofill выбирает автоматически заполняемые поля браузером. Поместите свою метку рядом с входом и выберите его с помощью селектора: -webkit-autofill. Если вам нужна дополнительная помощь, поделитесь своей текущей структурой html.

Конечно! Вот мой HTML Помогите, пожалуйста. благодаря
https://pastebin.com/yjJCip3r

Для этой ошибки есть решение css

// Selects label that comes right after the autofilled input
input:-webkit-autofill + label {
    // Insert your active label styles
}

Не могли бы вы объяснить, что это значит?

: -webkit-autofill выбирает автоматически заполняемые поля браузером. Поместите свою метку рядом с входом и выберите его с помощью селектора: -webkit-autofill. Если вам нужна дополнительная помощь, поделитесь своей текущей структурой html.

Конечно! Вот мой HTML Помогите, пожалуйста. благодаря
https://pastebin.com/yjJCip3r

Ваши ярлыки идут сразу после ввода, поэтому вам не нужно ничего делать с html.
Просто выберите свои метки рядом с автозаполненными входами и установите для них свои активные стили меток, как показано ниже.

.mdl-textfield__input:-webkit-autofill + .mdl-textfield__label {
    // Active label styles here
    top: -20px; // Just an example
    transform: scale(0.75); // Just an example
}

@ Kishan3 Думаю, ты заблудился. MDL таков -> https://github.com/google/material-design-lite/issues/4827 😆

(Хотя, учитывая, что MDL мертв, Джим, возможно, вы все-таки пришли в нужное место!)

Блин! Это сбивает с толку с именами. : смеясь: @mbrookes Один вопрос: можем ли мы использовать UI материалов непосредственно в HTML со ссылками на CDN? Я так и не понял, что MDL мертв: cry:

@ kishan3 Вы можете , хотя, как говорится в документации, это означает, что клиент должен загрузить всю библиотеку, по крайней мере, в первый раз, пока она не будет кэширована, тогда как создание ее локально означает, что вы можете оптимизировать, какие компоненты включены.

Какое решение?

Эта проблема касается v0.x.

@oliviertassinari этот

В моем случае я использую раскрывающийся список, когда пользователь выбирает что-то в раскрывающемся списке, он устанавливает значение в состояние, TextField, связанный со значением, не перемещает метку.

Изменить : Как кажется, если я инициализирую значения TextField с помощью null то поплавок не будет перемещаться при передаче нового значения. Исправлено путем инициализации значений в состоянии пустой строкой вместо null

Если кто-то еще здесь, я просто установил эту опору InputLabelProps={{ shrink: true }} в текстовом поле, которое это произвело. Было лучшим решением для нашей команды.

@ tom-con, спасибо, мужик, у меня это отлично сработало

screen shot 2019-01-24 at 10 47 44 pm
эта проблема все еще существует в 2019 году ...

Если кто-то еще здесь, я просто установил эту опору InputLabelProps={{ shrink: true }} в текстовом поле, которое это произвело. Было лучшим решением для нашей команды.
Я очень растерялся, а вы решили проблему! Лучшее рекомендуемое решение!

Это проблема v0.x (2015 г.), см. # 14427.

Для этой ошибки есть решение css

// Selects label that comes right after the autofilled input
input:-webkit-autofill + label {
    // Insert your active label styles
}

@ozturkcangokkaya Привет, это решение css отлично работает в Chrome. Но когда я проверяю свою форму в firefox, плавающая метка не работает. Ты хоть представляешь, почему webkit-autofill влияет на firefox?

Пожалуйста, смотрите # 14427 для v4.

Лучшее решение - прекратить использование Materialize и использовать Bootstrap или другую библиотеку, поскольку вам нужно придумать обходной путь, а Google, похоже, не заинтересован в устранении проблемы.

Если кто-то еще здесь, я просто установил эту опору InputLabelProps={{ shrink: true }} в текстовом поле, которое это произвело. Было лучшим решением для нашей команды.

Спасибо, я использую это: InputLabelProps={{ shrink: form.password }} , и он отлично работает.

<TextField
                id="loginPassword"
                label="Login Password"
                type="text"
                fullWidth
                value={form.password}
                onChange={(e) => setAttribute('form.password', e.target.value)}
                InputLabelProps={{ shrink: form.password }}
              />

Я решил свою проблему, установив lodash.merge в свой проект, после чего понял, что неправильно заполняю компонент текстового поля, потому что я думал, что поведение redux должно быть таким же, когда я использую вложенные объекты.

Как видите, я неправильно заполняю, когда смешиваю два вложенных объекта.

image

Я решил это с помощью библиотеки, и так оно и было.
image

Обратите внимание, что последняя версия Material-UI (v4.9.0) поддерживает его по умолчанию.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги

Смежные вопросы

FranBran picture FranBran  ·  3Комментарии

chris-hinds picture chris-hinds  ·  3Комментарии

mb-copart picture mb-copart  ·  3Комментарии

rbozan picture rbozan  ·  3Комментарии

anthony-dandrea picture anthony-dandrea  ·  3Комментарии