Ошибка при вызове JavaScript функции из компонента Blazor

Проблема с вызовом функции JS в приложении Blazor WebAssembly

Я пытаюсь выяснить, открыто ли моё приложение Blazor WebAssembly на мобильном устройстве. Поэтому я создал файл wwwroot/js/check-device.js с таким кодом:

function isMobile() {
   return /android|webos|iphone|ipad|ipod|blackberry|iemobile|opera mini|mobile/i.test(navigator.userAgent);
}

Я добавил ссылку на этот файл в index.html. В моем компоненте я использую следующий код:

@inject IJSRuntime JSRuntime
@code {
    private string deviceInfo { get; set; }
    private static bool isDeviceMobile { get; set; }

    protected async override Task OnAfterRenderAsync(bool firstRender)
    {
        if (firstRender)
        {
            isDeviceMobile = await JSRuntime.InvokeAsync<bool>("isMobile");
            deviceInfo = isDeviceMobile ? "Мобильное" : "Настольное";
        }
        await base.OnAfterRenderAsync(firstRender);
    }
}

Я получаю ошибку компиляции: “No overload for method ‘InvokeAsync’ takes 1 arguments”. После этого я добавил второй параметр:

isDeviceMobile = await JSRuntime.InvokeAsync<bool>("isMobile", new object[] { });

Теперь возникает другая ошибка: “An object reference is required for the non-static field, method, or property ‘JSRuntime.InvokeAsync(string, object)’”. Как правильно вызвать JavaScript функцию из компонента Blazor?

у меня было то же самое недавно. проверь, что скрипт вообще загружается - часто проблема не в коде, а в том что браузер не успел подгрузить js файл. добавь небольшую задержку перед вызовом или оберни в try-catch. и если blazor server используешь - там js работает чуть по-другому

Проблема в том, что ты пытаешься вызвать IJSRuntime из статического контекста. Поле isDeviceMobile объявлено как static, а JSRuntime - не статический. Убери static из объявления переменной:

private bool isDeviceMobile { get; set; }

И синтаксис вызова правильный - await JSRuntime.InvokeAsync<bool>("isMobile") должен работать без дополнительных параметров, если функция их не принимает.