New to Telerik UI for Blazor? Download free 30-day trial

Label not moved from input on browser autofill in Chrome

Environment

Product TextBox for Blazor

Description

When the browser autofills a textbox, the label is not moved from the input - it remains overlaying the text instead of moving up. This happens only in Chrome. It works fine in Firefox and Edge.

A short video of the browser behavior and how the Blazor model data is only updated when some other action happens - a click somewhere or you typing in the input

Blazor Chrome AutoFill Does Not Update Value

Steps to Reproduce

Create a simple form with a textbox and a password box. Click its Submit button and when Chrome prompts you to Save the user-password, Save them. Refresh the page. The browser autofills the form.

Expected: The textbox label is above the textbox.

Actual: The textbox label is still "inside" the textbox.

Sample reproducible

<form>
    @* The autofill should populate these lines here, but it does not *@
    @SomeUserModel.UserName
    <br />
    @SomeUserModel.Password
    <br />
    <input @bind="@SomeUserModel.UserName" />
    <br />
    <TelerikTextBox @bind-Value="@SomeUserModel.UserName" />
    <br />
    <input type="password" @bind="@SomeUserModel.Password" />
    <br />
    <button type="submit">Submit</button>
</form>

@code{ 
    public class SomeModel
    {
        public string UserName { get; set; }
        public string Password { get; set; }
    }

    SomeModel SomeUserModel { get; set; } = new SomeModel();
}

Possible Cause

It seems Chrome updates only the rendering, but no the actual value of the input. This also happens with the regular <input> elements.

The data Chrome filled in does not appear in the Blazor model and so the Blazor components don't actually see the change in order to update.

Suggested Workarounds

At the time of writing, we are not aware of ways to work around this browser behavior.

You can try setting the autocomplete="off" attribute on the form to prevent the autofill in the first place, yet it is up to the browser to respect it and it may not.

General suggestions on the Internet are to handle events like mouseover or mouseenter on the form/page to detect that the user is doing something, so you can try updating your form - in Blazor that would be calling StateHasChanged(). The downside of this is that it can cause severe performance issues in Blazor if called repeatedly. Moreover, in our local tests, neither calling StateHasChanged(), nor invoking a JS click on the body, nor updating a third field in the model helped (you can't update the autofilled fields because it will defeat the purpose of the autofill, and it seems that their value still does not exist - even if you update one, the other does not get populated).

See Also

In this article