首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何不用JS打开一个新窗口?

如何不用JS打开一个新窗口?
EN

Stack Overflow用户
提问于 2020-07-07 06:03:45
回答 6查看 16.5K关注 0票数 18

在blazor中,我使用NavigationManager.NavigateTo(url)来更改窗口位置,但如何使用它打开具有指定URL的新选项卡,而不必在OnAfterRenderAsync()上调用JS

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2020-07-07 06:09:25

从2022年6月1日起,目前还没有办法直接使用纯Blazor,您将需要使用JSInterop。幸运的是,这很容易做到。在.razor文件顶部添加

代码语言:javascript
运行
复制
@inject IJSRuntime JSRuntime;

然后像这样使用它

代码语言:javascript
运行
复制
await JSRuntime.InvokeAsync<object>("open", url, "_blank");

注意,IJSRuntime接口本身只提供了一个InvokeAsync方法,JSRuntimeExtensions类为IJSRuntime提供了一个扩展方法,用于直接调用一个没有返回值的方法:InvokeVoidAsync

代码语言:javascript
运行
复制
await JSRuntime.InvokeVoidAsync("open", url, "_blank");
票数 31
EN

Stack Overflow用户

发布于 2020-09-29 12:32:04

以前这段代码起作用了。

代码语言:javascript
运行
复制
await _jsRuntime.InvokeVoidAsync("open", new object[2] { url, "_blank" });

目前,它导致了一个不明确的例外:

代码语言:javascript
运行
复制
> "TypeError: Converting circular structure to JSON

我在这里发现了这种行为(https://github.com/dotnet/aspnetcore/issues/16632):

这是因为window.open返回一个WindowProxy对象(参见https://developer.mozilla.org/en-US/docs/Web/API/Window/open)。WindowProxy不是JSON可序列化的,因此不能用作.NET代码的返回值。 要解决这个问题,不要直接调用window.open,而是调用您自己的JS函数,它要么什么都不返回,要么返回一些JSON可序列化的东西。

根据上面的建议,我在index.html中添加了以下内容:

代码语言:javascript
运行
复制
<script>
    window.blazorOpen = (args) => {
        window.open(args);
    };
</script>

并修改了我的C#代码隐藏调用,以传递窗口参数:

代码语言:javascript
运行
复制
await _jsRuntime.InvokeVoidAsync("blazorOpen", new object[2] { url, "_blank" });

我们现在有效地避免了这个问题,方法是丢弃由WindowProxy返回的window.open对象,该对象以前被返回给InvokeVoidAsync,而.NET试图(失败)处理。

票数 18
EN

Stack Overflow用户

发布于 2021-06-14 17:35:02

使用时将获得TypeError: Converting circular structure to JSON

代码语言:javascript
运行
复制
await _jsRuntime.InvokeVoidAsync("open", new object[2] { url, "_blank" });

代码语言:javascript
运行
复制
await _jsRuntime.InvokeAsync<object>("open", url, "_blank");

这是因为window.open返回一个WindowProxy对象(参见https://developer.mozilla.org/en-US/docs/Web/API/Window/open)。WindowProxy不是JSON可序列化的,因此不能用作.NET代码的返回值。

摘自这里

为了使用javascript函数绕过这个w/o,我使用以下方法

代码语言:javascript
运行
复制
await JSRuntime.InvokeVoidAsync("eval", $"let _discard_ = open(`{url}`, `_blank`)");
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62769031

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档