Material-ui: [TextField] El llenado automático de formularios no actualiza el texto de la etiqueta flotante en el campo de texto

Creado en 29 may. 2015  ·  75Comentarios  ·  Fuente: mui-org/material-ui

Cuando usa Chrome para autocompletar campos de texto, el texto de la etiqueta flotante no se anima ni se muestra en absoluto (a partir de 0.8.0)

bug 🐛 TextField external dependency v0.x

Comentario más útil

Si alguien todavía está aquí, simplemente configuro este prop InputLabelProps={{ shrink: true }} en el TextField que esto afectó. Fue la mejor solución para nuestro equipo.

Todos 75 comentarios

Este es probablemente un buen lugar para comenzar ...

@illogikal ¿ podrías publicar un gif de eso?

Aqui tienes:

image

El resaltado amarillo indica que los campos se han completado automáticamente. Como puede ver, la contraseña está completa, pero la etiqueta sigue en su lugar.

Mm, eso es interesante. @mbrookes ¿Sabe si es para todos los tipos de entrada o solo para entradas de contraseña?

No estoy seguro: intenté cambiar el orden de la dirección y la contraseña, pero la función de autocompletar no se activó, ya sea para ingresar un usuario / contraseña conocidos o para guardar uno nuevo. Tendré que encontrar la mejor forma de probar otros campos.

Bien, planeo volver a refactorizar algunas de las cosas de TextField en un futuro cercano. Intentaré experimentar un poco también. Avísame si notas algo más.

¡Hola! Nos encontramos con este problema. ¿Hay algo que podamos hacer localmente para probar y experimentar con algunas posibles soluciones para esto? ¿O va a tener que esperar a una refactorización?

Tenemos el problema exacto con el campo de contraseña mencionado anteriormente. Además de eso, tenemos un problema similar con un TextField simple. Tenemos un conjunto de texto de sugerencia que desaparece si ingresa valores. Sin embargo, si establecemos un valor cuando la página se procesa (enlace profundo), el texto de sugerencia sigue siendo visible detrás del valor real. ¿Es probable que se trate del mismo problema o sería algo diferente?

image

¿Es probable que se trate del mismo problema o sería algo diferente?

Eso parece un problema diferente.

ese código podría agregarse a onChange para actualizar un state.isAutofilled

Versión de Chrome 49.0.2623.87 (64 bits) OS X El Capitan

image

si se presiona cualquier tecla o se hace clic con el mouse, flota correctamente, pero la carga inicial está rota.

Exactamente el mismo problema:

s

¿Alguna idea, chicos?

Experimentando el mismo problema.

¿Hay alguna forma de deshabilitar el autocompletado que funcione con MUI?

@ kand617

Simplemente cree un par de campos y ocúltelos con " display: none ". Ejemplo:



Luego ponga sus campos reales debajo.

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

alguna solución para disparar el evento onChange?

@antoinerousseau ¿Esto se fusionará en master?

Este podría ser un problema similar (¿la misma causa raíz, una manifestación diferente?)

No veo los problemas de animación como se mencionó, pero la altura del contenedor TextField no tiene en cuenta el margen superior en la entrada. Esto da como resultado que TextField se extienda 14px por debajo del contenedor. Es una solución alternativa bastante sencilla, pero solo la veo con autocompletar:

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

Esto se solucionará pronto;)

image

buen @nathanmarks , gracias !!

¿Y encontraste un truco para actualizar la etiqueta flotante cuando Chrome se autocompleta sin hacer clic en la página también?

Este sigue siendo un tema bastante doloroso.

Intenté usar vanilla-autofill-event que simplemente no funcionó.

Estoy usando redux-form (como muchos otros) y encontré una solución desagradable (solo para mi formulario de inicio de sesión, no me importan otros formularios).
Lo probé solo en cromo, así que úselo en consideración.

Cuando agregué un nombre de usuario oculto y campos de contraseña, Chrome ignoró todo el formulario (a menos que los ocultara con display: none que a Chrome no le importara).

Así que utilicé 4 (: decepcionado:) campos adicionales. 2 para hacer que Chrome ignore mi formulario (autocomplete = off no funcionó) y 2 más en un formulario falso diferente para hacer el relleno de Chrome, que en componentDidMount agregué un tiempo de espera que copió los valores de los campos falsos a los reales usando redux evento de cambio de formulario:

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)
}

Modifiqué el código para simplificarlo, así que úselo solo como referencia.

@ adamtal3 es autoComplete="off"

@justinko Realmente no importa. Si usa autoComplete react lo cambiará a autocomplete .
Puede ver que utilicé un valor de cadena ( "off" ) y no un valor js ( {'off'} ).

Si te refieres a los estándares y la consistencia de React, estoy de acuerdo, pero no creo que sea gran cosa.

Esta es mi solucion.

Primero, verifiqué si el nombre de usuario se rellena automáticamente cuando el componente se montó.
Si es así, actualizaría el estado del campo de contraseña.
Una vez que hasValue convierta en verdadero, la etiqueta flotante se actualizará.

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

Espero que esto ayude. :)

Encontré una manera de actualizar la etiqueta flotante cuando el navegador la llenó automáticamente.
'

setTimeout (function () {
var autofilled = document.querySelectorAll ('input # password: -webkit-autofill');
if (autocompletado) {
$ ("entrada [tipo = contraseña]"). parent (). addClass ("está-sucio");
}
}, 500);
'
esto debe estar dentro de su documento listo al final.
class "is-dirty" es la clase que activa su etiqueta flotante.

Estoy usando redux-form con react-ui. La solución para mí es colocar la entrada falsa justo después de la entrada necesaria.

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

Con suerte, React 16 debería solucionarlo: https://github.com/facebook/react/issues/7211#issuecomment -266774957

El mismo problema me sucedió cuando actualicé de 0.17.1 a 0.18.1

Arregle eso funcionó para mí:

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} />
    }
}

El puerto trasero de la corrección acaba de ser lanzado en React 15.6.0 . ¿Alguien en condiciones de probar si resuelve este problema?

[Para su información: la publicación "yo también" anterior se eliminará; utilice los botones de votación en lugar de pulsar la discusión.].

@mbrookes No fijo como lo probé.

@Stupidism Detalles?

Como el que publicaste hace 2 años. https://github.com/callemall/material-ui/issues/718#issuecomment -167445748

@Stupidism ¿Qué versión de Material-UI, qué versión de React, qué navegador / versión?

  "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: En ese caso, la solución alternativa de @ whtang906 parece ser la mejor opción por ahora.

Para forma 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}
            />

Mi aplicación es un poco lenta, así que agregué un seguro

  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)
  }

No se puede obtener valor del campo de contraseña autocompletado de Chrome
https://stackoverflow.com/questions/35049555/chrome-autofill-autocomplete-no-value-for-password

Por lo que he estado jugando con la rama v1-beta, el problema se ha solucionado en el camino. Podría ser la reescritura o una actualización de react. Estoy cerrando hasta que escuchemos más sobre eso. ¡Gracias por la discusión aquí!

image
El error aún existe ...
[email protected]
[email protected]
Cromo 60.0.3112.90

@artalar Prueba la solución componentDidMount O (∩_∩) O

@Stupidism ¡ Gracias por la solución! Probé todo lo anterior y ninguno funcionó. Quizás porque la mayoría tienen entre 1 y 2 años ...
Por cierto, este error solo ocurre en Chrome, Firefox está perfectamente bien :)

@ Ivan-Parushev Supongo que se debe a que se ha cambiado el uso de ref. Entonces, ¿tu problema está resuelto o no?

No resuelto aquí, estoy completando los valores de localStorage si existen en componentDidMount, y el mismo error con todas las últimas versiones.

Todavía esperando una solución ...

Estoy bloqueando el hilo. Este número tiene 2 años. Como ahora nos estamos enfocando en la rama v1-beta. Si alguien tiene un ejemplo de reproducción, abra una nueva edición para la rama v1-beta.

Ya han pasado 3 años. Este problema aún existe con las últimas versiones de react y material ui.

@tschaub Jaja, como si la entrada de posición fija de ios se enfocara en el problema.

@tsmirnov Es hora de que te

Hay una solución CSS para este error.

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

Aqui tienes:

image

El resaltado amarillo indica que los campos se han completado automáticamente. Como puede ver, la contraseña está completa, pero la etiqueta sigue en su lugar.

Estoy enfrentando el mismo problema.

Hay una solución CSS para este error.

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

¿Puede explicar qué significa esto?

Hay una solución CSS para este error.

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

¿Puede explicar qué significa esto?

: -webkit-autofill selecciona campos autocompletados por navegador. Coloque su etiqueta junto a la entrada y selecciónela con: -webkit-autofill selector. Si necesita más ayuda, comparta su estructura html actual.

Hay una solución CSS para este error.

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

¿Puede explicar qué significa esto?

: -webkit-autofill selecciona campos autocompletados por navegador. Coloque su etiqueta junto a la entrada y selecciónela con: -webkit-autofill selector. Si necesita más ayuda, comparta su estructura html actual.

¡Por supuesto! Aquí está mi HTML. Por favor ayuda. Gracias
https://pastebin.com/yjJCip3r

Hay una solución CSS para este error.

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

¿Puede explicar qué significa esto?

: -webkit-autofill selecciona campos autocompletados por navegador. Coloque su etiqueta junto a la entrada y selecciónela con: -webkit-autofill selector. Si necesita más ayuda, comparta su estructura html actual.

¡Por supuesto! Aquí está mi HTML. Por favor ayuda. Gracias
https://pastebin.com/yjJCip3r

Sus etiquetas vienen inmediatamente después de las entradas, por lo que no tiene que hacer nada con html.
Simplemente seleccione sus etiquetas junto a las entradas autocompletadas y establezca sus estilos de etiqueta activos como se muestra a continuación.

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

Uh, @ kishan3 creo que estás perdido. MDL es así -> https://github.com/google/material-design-lite/issues/4827 😆

(Aunque dado que MDL está muerto, Jim, ¡quizás hayas venido al lugar correcto después de todo!)

¡Ah, maldita sea! Es confuso con los nombres. : riendo: @mbrookes Sin embargo, una pregunta: ¿podemos usar material UI directamente en HTML con enlaces CDN? Nunca me di cuenta de que MDL está muerto: llora:

@ kishan3 Puede , aunque como dice en los documentos, esto significa que el cliente tiene que descargar la biblioteca completa, al menos la primera vez hasta que esté en caché, mientras que compilarla localmente significa que puede optimizar qué componentes están incluidos.

¿Cual es la solución?

Este problema se refiere a v0.x.

@oliviertassinari este todavía existe en v3.4.0.

En mi caso, estoy usando un menú desplegable, cuando el usuario selecciona algo en el menú desplegable, establece el valor en el estado, el TextField asociado al valor no hace flotar la etiqueta.

Editar : como parece, si inicio los valores de TextField con null , el flotador no se moverá cuando se pase un nuevo valor. Se corrigió inicializando los valores en el estado con una cadena vacía en lugar de null

Si alguien todavía está aquí, simplemente configuro este prop InputLabelProps={{ shrink: true }} en el TextField que esto afectó. Fue la mejor solución para nuestro equipo.

@ tom-con gracias hombre, funcionó perfectamente para mí

screen shot 2019-01-24 at 10 47 44 pm
este problema todavía existe en 2019 ...

Si alguien todavía está aquí, simplemente configuro este prop InputLabelProps={{ shrink: true }} en el TextField que esto afectó. Fue la mejor solución para nuestro equipo.
¡Estaba realmente confundido y resolviste el problema! ¡La mejor solución recomendada!

Este es un problema v0.x (2015), consulte el número 14427.

Hay una solución CSS para este error.

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

@ozturkcangokkaya Hola, esta solución css funciona bien en Chrome. Pero cuando reviso mi formulario en Firefox, la etiqueta flotante no funciona. ¿Tiene alguna idea de por qué el llenado automático de webkit afecta a Firefox?

Consulte # 14427 para v4.

La mejor solución es dejar de usar Materialise y usar Bootstrap u otra biblioteca, ya que tiene que encontrar una solución alternativa y Google parece no tener interés en solucionar el problema.

Si alguien todavía está aquí, simplemente configuro este prop InputLabelProps={{ shrink: true }} en el TextField que esto afectó. Fue la mejor solución para nuestro equipo.

Gracias, estoy usando esto: InputLabelProps={{ shrink: form.password }} , y funciona perfectamente.

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

Resolví mi problema al instalar lodash.merge en mi proyecto y luego me di cuenta de que estaba llenando el componente de campo de texto incorrectamente porque pensé que el comportamiento de redux debería ser el mismo cuando uso objetos anidados.

Como puede ver, no estoy llenando correctamente cuando mezclo dos objetos anidados.

image

Resolví esto usando la biblioteca y así fue.
image

Tenga en cuenta que la última versión de Material-UI (v4.9.0) lo admite de forma predeterminada.

¿Fue útil esta página
0 / 5 - 0 calificaciones