【发布时间】:2021-09-15 00:48:11
【问题描述】:
我正在使用 Visual Studio 2019 创建 Blazor PWA 应用程序。我使用 javascript 在启动和某些关键事件期间将焦点设置到 InputText 字段。
function focusInput(id){
document.getElementById(id).focus();
var tb = document.querySelector("#" + id);
if (tb.select) {
tb.select();
}
}
并像这样在我的代码中调用它
private string inputID = "user-id";
protected async override Task OnAfterRenderAsync(bool firstRender)
{
await jsInterop.InvokeVoidAsync("focusInput", inputID);
}
这是剃须刀页面
<EditForm Model="@login" class="card card-body mt-2">
<div class="form-group row">
<label for="userid" class="col-sm-2 col-form-label">User ID</label>
<InputText id="@inputID" class="form-control" @bind-Value="@login.UserID" @onkeyup="(KeyboardEventArgs e) => KeyUpUserIDAsync(e)"/>
</div>
<div class="form-group row">
<label for="message" class="col-sm-2 col-form-label">Message</label>
<InputTextArea id="textarea-message" class="form-control" @bind-Value="@errorMessage" />
</div>
</EditForm>
它工作得很好,除非我运行它并加载第一页,即登录页面。焦点不是在字段中,而是留在 URL 栏中。如果我刷新页面 InputeText 获得焦点。请注意,我登录后导航到的所有其他页面都没有这个问题。只是初始页面。我写信给控制台以确保它被调用了。我也尝试过使用 autofocus 属性,但它也不起作用。
【问题讨论】:
-
是的,我也遇到过。估计是浏览器问题。您可能正在将焦点设置到元素,但是当页面完成加载时,浏览器会将焦点设置回 URL 栏。据推测,如果用户在 URL 栏中输入内容,Chrome(或其他)不希望您劫持用户的意图。顺便说一句,.net 5 有一个命令:docs.microsoft.com/en-us/dotnet/api/… 我不确定这是否会有所不同(我有点怀疑),但你可以试试。
-
您的疑问已得到证实。我有另一个选项,我在这里找到了 meziantou.net/auto-focus-an-input-in-a-blazor-form.htm,如果可行,我会发回一个示例。
-
我怀疑这种方法在大约 95% 的时间里都可以工作,并且出于同样的原因。
标签: c# blazor progressive-web-apps