
前提
- Visual Studio Community 2022
- ASP.NET Core6.0 Blazor Sorver アプリ
- MSドキュメント:イベントをすぐにトリガーしないを参照しています。
実現したいこと
- JavaScriptからのマウスイベントを.NETでMouseEventArgs やDragEventArgsとして受け取りたい。
そうすれば、ブラウザからのイベント数を絞れるので、ドラッグイベントの負荷を軽くしたい。
発生している問題・エラーメッセージ
単純化のためにクリックイベントで実験中
- String型やBool型の引数のやり取りはできるのに、PointerEventArgs? MouseEvetArgs?等で受け取ろうとすると、すべての値が無効=0になる。
- 原因というか仕組みの理解不足だと思っています。
該当のソースコード
デフォルトのテンプレートから以下の3つのファイルだけ編集しています。
ログインオプションやDockerオプションは指定していません。
変更
Pages\Index.razor
1@inject IJSRuntime JS 2@page "/" 3 4<PageTitle>Index</PageTitle> 5 6<button @ref=@button1 style="margin:1em">Click</button> 7clickcount:@count1 8@ArgsInfo1 9<br /> 10<button @ref=@button2 style="margin:1em">Click</button> 11clickcount:@count2 12@ArgsInfo2 13 14<h1>Hello, world!</h1> 15 16Welcome to your new app. 17 18<SurveyPrompt Title="How is Blazor working for you?" /> 19@code { 20 21 ElementReference? button1, button2; 22 int count1, count2; 23 string? ArgsInfo1, ArgsInfo2; 24 25 [JSInvokable] 26 public void JSHandleOnClick1(MouseEventArgs e) 27 { 28 count1++; 29 ArgsInfo1 = e.ClientX.ToString(); 30 StateHasChanged(); 31 } 32 33 [JSInvokable] 34 public void JSHandleOnClick2(int clientx) 35 { 36 count2++; 37 ArgsInfo2 = clientx.ToString(); 38 StateHasChanged(); 39 } 40 41 protected override async Task OnAfterRenderAsync(bool firstRender) 42 { 43 if (firstRender) 44 { 45 if (firstRender) 46 { 47 var DotNetObject = DotNetObjectReference.Create(this); 48 await JS.InvokeAsync<IJSObjectReference>("import", "./Pages/Index.razor.js"); 49 await JS.InvokeVoidAsync("AddClickEventone", button1, DotNetObject, "click"); 50 await JS.InvokeVoidAsync("AddClickEventtow", button2, DotNetObject, "click"); 51 } 52 } 53 await base.OnAfterRenderAsync(firstRender); 54 } 55}
Pages_Layout.cshtml
1@using Microsoft.AspNetCore.Components.Web 2@namespace BlazorApp1.Pages 3@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers 4 5<!DOCTYPE html> 6<html lang="en"> 7<head> 8 <meta charset="utf-8" /> 9 <meta name="viewport" content="width=device-width, initial-scale=1.0" /> 10 <base href="~/" /> 11 <link rel="stylesheet" href="css/bootstrap/bootstrap.min.css" /> 12 <link href="css/site.css" rel="stylesheet" /> 13 <link href="BlazorApp1.styles.css" rel="stylesheet" /> 14 <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.20/lodash.min.js"></script> 15 <component type="typeof(HeadOutlet)" render-mode="ServerPrerendered" /> 16</head> 17<body> 18 @RenderBody() 19 20 <div id="blazor-error-ui"> 21 <environment include="Staging,Production"> 22 An error has occurred. This application may no longer respond until reloaded. 23 </environment> 24 <environment include="Development"> 25 An unhandled exception has occurred. See browser dev tools for details. 26 </environment> 27 <a href="" class="reload">Reload</a> 28 <a class="dismiss">🗙</a> 29 </div> 30 31 <script src="_framework/blazor.server.js"></script> 32</body> 33</html>
新規作成
Pages\Index.razor.js
1window.AddClickEventone = 2 function (elem, component, name) { 3 elem.addEventListener(name, 4 _.throttle(e => { 5 component.invokeMethodAsync("JSHandleOnClick1", 6 e 7 ); 8 } 9 , 1000 10 , { leading: true, trailing: true })); 11 return; 12 }; 13 14window.AddClickEventtow = 15 function (elem, component, name) { 16 elem.addEventListener(name, 17 _.throttle(e => { 18 component.invokeMethodAsync("JSHandleOnClick2", 19 e.clientX 20 ); 21 } 22 , 1000 23 , { leading: true, trailing: true })); 24 return; 25 };
試したこと
該当のソースコードで比較実験しました。
ASP.NET Core Blazor JavaScript の相互運用性のドキュメントについて眺めています。
最後に
難解な質問で申し訳なく思っています。
このページを見てくれた方に感謝を申し上げます。
ありがとうございます。









回答1件
あなたの回答
tips
プレビュー