23

我刚开始玩 Blazor,我已经看到了这个新框架的巨大潜力。

不过,我想知道它将如何处理简单的事情,例如将焦点设置在输入控件上?例如,在我处理了一个点击事件之后,我想将焦点设置到一个文本输入控件。我是否必须使用 JQuery 来完成类似的事情,或者 Blazor 是否会有一些内置的方法来完成类似的事情?

谢谢

更新:我在下面发布了一个答案,其中包含一个示例,说明如何通过调用 .Net 代码中的 JavaScript 函数将焦点设置为控件。

截至目前(Blazor 0.9.0),您在 Index.html 中创建 JavaScript 函数(或从 Index.html 引用它们),然后在 Blazor 页面或组件中调用 JsRuntime.InvokeAsync("functionName", parms);

https://docs.microsoft.com/en-us/aspnet/core/razor-components/javascript-interop

4

4 回答 4

15

Blazor 只是 JavaScript 的替代品(更准确地说是“增值”)。它是一个仅限客户端的解决方案(但它可能会在将来添加一些与 ASP.NET 的简单绑定)。

不过,它完全基于 HTML 和 CSS。C# 正在使用 Web 程序集替换 JS 部分。因此,您访问/修改 HTML 控件的方式没有任何改变。

截至目前(0.1.0 版),您必须依靠 HTML DOMfocus()方法来完成您打算做的事情(是的,您现在必须使用JavaScript :( )。

// Not tested code
// This is JavaScript. 
// Put this inside the index.html. Just below <script type="blazor-boot"></script>
<script>
    Blazor.registerFunction('Focus', (controlId) => {
      return document.getElementById(controlId).focus();
    });
</script>

//and then wrap it for calls from .NET:    
// This is C#

public static object Focus(string controlId)
{
    return RegisteredFunction.Invoke<object>("Focus", controlId);
    //object type is used since Invoke does not have a overload for void methods. Don't know why. 
    //this will return undefined according to js specs
}

有关更多信息,您可以参考以下内容。

如果你想改进 JS 的打包整齐,你可以这样做: https ://stackoverflow.com/a/49521216/476609

public class BlazorExtensionScripts : Microsoft.AspNetCore.Blazor.Components.BlazorComponent
{
    protected override void BuildRenderTree(Microsoft.AspNetCore.Blazor.RenderTree.RenderTreeBuilder builder)
    {
        builder.OpenElement(0, "script");
        builder.AddContent(1, "Blazor.registerFunction('Focus', (controlId) => { document.getElementById(controlId).focus(); });");
        builder.CloseElement();
    }

    public static void Focus(string controlId)
    {
        RegisteredFunction.Invoke<object>("Focus", controlId);
    }
}

然后将此组件添加到根目录:(App.cshtml):

<BlazorExtensionScripts></BlazorExtensionScripts>
<Router AppAssembly=typeof(Program).Assembly />
于 2018-03-24T09:29:59.103 回答
11

我想添加一个更新的(从 0.9.0 开始)示例,该示例调用 JavaScript 函数以在某些事件之后将焦点设置到另一个控件,例如单击按钮。这对于刚开始使用 Blazor 的人(比如我)可能会有所帮助。

此示例基于https://docs.microsoft.com/en-us/aspnet/core/tutorials/build-your-first-razor-components上的 Blazor 文档“构建您的第一个 Blazor 组件应用程序”中的示例代码构建。app?view=aspnetcore-3.0

首先,按照文档中的所有说明进行操作。当您有一个有效的待办事项列表页面时,请添加以下内容:

  1. 在 Index.html 的底部、wwwroot 下以及加载 webassembly.js 的脚本标记下方,添加以下脚本:
<script>
        window.MySetFocus = (ctrl) => {
            document.getElementById(ctrl).focus();
            return true;
        }
</script>
  1. 在 todo.cshtml 页面的顶部,添加以下 using 语句:
@inject IJSRuntime JsRuntime;
  1. 在 todo.cshtml 页面的 @functions 部分中,添加以下函数:
    async void Focus(string controlId)
    {
        var obj = JsRuntime.InvokeAsync<string>(
            "MySetFocus", controlId);
    }

  1. 在 AddToDo() 函数中,就在将“newToDo”变量设置为空字符串的行下方,添加对 Focus 函数的调用,传入输入控件的字符串 id。(文档中的示例没有为输入控件分配 ID,因此只需自己添加一个。我将我的命名为“todoItem”)。

void AddTodo()
    {
        if (!string.IsNullOrWhiteSpace(newTodo))
        {
            todos.Add(new TodoItem { Title = newTodo });
            newTodo = string.Empty;
            Focus("todoItem"); // this is the new code
        }
    }

  1. 构建并运行您的应用程序。当您单击添加新项目按钮时,新项目应添加到列表中,输入控件变为空白,焦点应回到输入控件中,准备添加另一个项目。
于 2019-03-13T00:50:40.040 回答
3

从 .NET 5 预览版 8

在 Blazor 应用中设置 UI 焦点

Blazor 现在在 ElementReference 上有一个 FocusAsync 便捷方法,用于将 UI 焦点设置在该元素上。

<button @onclick="() => textInput.FocusAsync()">Set focus</button>
<input @ref="textInput"/>
于 2020-08-26T23:19:04.370 回答
0

您不能直接调用 JavaScript 函数。您需要先注册您的功能,例如,

<script>
 Blazor.registerFunction('ShowControl', (item) => {       
     var txtInput = document.getElementById("txtValue");         
     txtInput.style.display = "";
     txtInput.value = item;
     txtInput.focus();          
});
return true;
</script>

然后你需要在 C# 中声明一个调用这个 JavaScript 函数的方法。喜欢,

private void CallJavaScript()
{
   RegisteredFunction.Invoke<bool>("ShowControl", itemName);
}

您可以在单击按钮时调用此 C# 方法。喜欢,

<button id="btnShow" class="btn btn-primary" @onclick(CallJavaScript)>Show</button>

这篇文章使用 Blazor 和 ASP.NET Core 创建一个 CRUD 应用程序 展示了一个从 Blazor 调用 JavaScript 的工作演示。

于 2018-04-05T11:12:26.580 回答