JsInterop javascript端是如何以及在哪里在Blazor服务器应用程序中实现的



上下文

我正在努力了解JsInteropjavascript端是如何以及在哪里实现的。

在我的Blazor服务器项目中给出以下示例代码:

public static ValueTask<string> Prompt(IJSRuntime jsRuntime, string message)
{
// Implemented in exampleJsInterop.js
return jsRuntime.InvokeAsync<string>(
"exampleJsFunctions.showPrompt",
message);
}

及其javascript对应项:

window.exampleJsFunctions = {
showPrompt: function (message) {
return prompt(message, 'Type anything here');
}
};

(我确实理解SignalR基础设施及其对电路概念的使用,我确实理解Blazor server项目中电路用于双向客户端-服务器通信。(

问题

该项目使用的唯一客户端脚本是:<script src="_framework/blazor.server.js"></script>就理解而言,所有javascript执行调度功能都应该存在。我认为从服务器端完成javascript调用的唯一方法是一些javascript eval((功能。我试图找到源代码_framework/blazor.server.js,我想它就在github中,因为它在/dist文件夹中的构建输出包含文件blazor.server.js

我试图在typescript源中找到这一部分(其中执行了来自服务器的javascript函数名所给出的javascript函数(,但没有成功。有人能给我指正确的方向吗?我是找错地方了,还是没有eval((?

***edit:同时我了解到,这里不仅播放eval((,实际上这是最后一次机会,还有window["functionName"](arguments);及其变体。仍在寻找相关的来源行。。。

我正在努力了解JsInterop javascript端是如何以及在哪里实现的。

在应用程序主页中,通常是_Host.cshtml(或_index.cshtml或wwwroot/index.html等,取决于您的服务器代码结构(,位于<head><body>标记的末尾。您可以在那里放置<script src="path/to/exampleJsFunctions.js"></script>,也可以在<script>标记中立即定义函数。

仅供参考,blazor.server.js脚本负责浏览器和服务器之间的websocket连接。当您在应用程序中调用Prompt(...)方法时,服务器会要求浏览器(通过websocket(运行在window中定义的名为exampleJsFunctions.showPrompt的js函数,并使用给定的参数message。如果js函数是在window中定义的,浏览器将运行它(如果使用浏览器devtools在上面设置断点,它就会被击中(。否则,它将抛出一个错误。没有eval

(实际上,如何定义浏览器的函数并不重要。唯一重要的是服务器要求浏览器调用该函数时,浏览器可以在window对象下方找到该函数。(

如果您非常想了解源代码,那么应该在jsinterop源代码中找到它。

您可以在blazor.JS文件下添加自定义JS文件。在它中,您可以声明您的函数,然后通过JsRuntime从剃刀组件调用它。

我发现的最简单的方法是将IJSRuntime注入到组件中。

@inject IJSRuntime JSRuntime;

相关内容

  • 没有找到相关文章

最新更新