如何在 Blazor 的 Javascript 中获取/注入 onclick 句柄

Posted

技术标签:

【中文标题】如何在 Blazor 的 Javascript 中获取/注入 onclick 句柄【英文标题】:How to get/inject onclick handle in Javascript for Blazor 【发布时间】:2021-07-29 18:30:38 【问题描述】:

此要求的主要目标是获取缩放图像上点击事件的像素坐标。

我在 Blazor 组件上有以下 img 标签:

<img id="cameraFrame" src="@($"data:image/png;base64,@ViewModel.DisplayFrameImageBytes")"
     @onclick="CameraFrameClick"/>

我的 CameraFrameClick 需要像素级坐标,如果您只在 C# 中使用 args.OffsetX/Y,那么您会在图像上点击像素,但如果图像被缩放,这与图像像素无关,但是在屏幕上显示像素。

我想将 @onclick="CameraFrameClick" 捕获到某个 JS 变量,所以我可以在图像上的自定义 JS 点击事件上自己调用它。

例如:

<script>
  #cameraFrame.onclick = function(args) 
     var bounds=this.getBoundingClientRect(); <<-- This is really what I need to use before going back to server.
     // Calculate PixelX and PixelY using args and bounds.
     var pixelX, pixelY;
     **cameraFrame.InvokeBlazorOnClick(pixelX, pixelY);**
  

有没有建议的方法来完成这个?好像很多时候在调用函数的handler之前可能需要先做一些js操作。

注意,这是服务器端 blazor。

【问题讨论】:

【参考方案1】:

我没有找到在返回 C# Blazor 调用之前调用 JS 代码的适当解决方案,但是如果这对任何人有用的话,我已经找到了一种在 Blazor 中实现 Pixel Click 坐标的方法。

https://mudblazor.com/ 具有 ElementReference 的扩展方法,可让您获取我试图在 JS 中获取的边界客户端矩形。

所以你可以用 Ref: 创建你的 img 标签:

<img id="cameraFrame" @ref=CameraFrameElement src="@($"data:image/png;base64,@ViewModel.DisplayFrameImageBytes")"
     @onclick="CameraFrameClick"/>

然后在您的事件处理程序上使用扩展方法来获取边界矩形。请注意,您仍然需要能够访问原始图像以获取宽度/高度,假设您仍有此数据在范围内,这将起作用。

ElementReference CameraFrameElement; <--- Binds to the img element using @ref
public async Task CameraFrameClick(MouseEventArgs args)

    var bounds = await CameraFrameElement.MudGetBoundingClientRectAsync(); <-- Extension method from MudBlazor
    <--- Calculate Pixel level coordinates, assuming you still have the image and its size.
    var pixelX = (args.OffsetX / bounds.Width) * ViewModel.LatestFrame.FrameCoordinates.FrameSize.Width;
    var pixelY = (args.OffsetY / bounds.Height) * ViewModel.LatestFrame.FrameCoordinates.FrameSize.Height;

    <---- Use the pixel level coordinates.
    await ViewModel.GoToImagePositionCmd
        .Execute(new PointF((float)pixelX, (float)pixelY))
        .ToTask();

【讨论】:

以上是关于如何在 Blazor 的 Javascript 中获取/注入 onclick 句柄的主要内容,如果未能解决你的问题,请参考以下文章

Blazor University (39)JavaScript 互操作 —— 更新 document title

如何在 Blazor Web Assembly 中将 c# 变量传递给 javascript

如何使用 Blazor 上传文件?

如何在没有 Blazor Web 组件的情况下从 JavaScript 使用 C# WebAssemly

如何在 c# blazor 网页中更新实时日期时间

在 Blazor 应用程序中自动注入 javascript