Запуск библиотек JavaScript (Looper) на стороне сервера Blazor-некоторый код javascript не выполняется

#javascript #jquery #blazor #looper

Вопрос:

Я пытаюсь внедрить тему Looper в свое серверное приложение blazor, и у меня есть библиотеки javascript, на которые ссылаются в конце in _Host.cshtml.Однако некоторые сценарии в theme.min.js не работает. Почему?

     <script src="/Library/vendor/jquery/jquery.min.js"></script>
    <script src="/Library/vendor/popper.js/umd/popper.min.js"></script>
    <script src="/Library/vendor/bootstrap/js/bootstrap.min.js"></script>
    <script src="/Library/vendor/pace-progress/pace.min.js"></script>
    <script src="/Library/vendor/stacked-menu/js/stacked-menu.min.js"></script>
    <script src="/Library/vendor/perfect-scrollbar/perfect-scrollbar.min.js"></script>
    <script src="/Library/javascript/theme.min.js"></script>
    <script src="_framework/blazor.server.js"></script>
 

Моя проблема в том, что в то время как

     <div data-toggle="drowndown"></div> works, but hamburger menu toggle 
<button class="hamburger hamburger-squeeze mr-2" type="button" data-toggle="aside-menu" aria-label="toggle aside menu"><span class="hamburger-box"><span class="hamburger-inner"></span></span></button>
 

не работает. Что я здесь упускаю? Что я делаю не так? Мой сценарий изменения темы также не запущен. Если я пройду через theme.js и я вижу, что этот скрипт запускается, когда blazor не активен (комментирует blazor.js) но при активном blazor этот скрипт не запускается.

 (line 610) in /library/javascript/theme.js
}, {
    key: "toggleAside",
    value: function toggleAside() {
      var _this4 = this;

      var $trigger = $('[data-toggle="aside"]');
      $trigger.on('click', function () {
        var isShown = $('.app-aside').hasClass('show');
        $trigger.toggleClass('active', !isShown);
        if (isShown) _this4.hideAside();else _this4.showAside();
      });
    }

 

Мое обоснованное предположение состоит в том, что theme.js использует ли blazor что-то, чего он не позволяет? Есть ли у кого-нибудь достаточно опыта работы с темой Looper (или с javascript в целом), чтобы знать, почему это не сработает? В частности, переключатель гамбургеров и код переключения тем

     (line 1992 in /library/javascript/theme.js)
var Looper = function () {
  var Looper = new Theme(); // toggle skin thought button

  $('[data-toggle="skin"]').on('click', function (e) {
    e.preventDefault();
    var skin = Looper.skin === 'dark' ? 'default' : 'dark';
    Looper.setSkin(skin); // we need to refresh our page after change the skin

    location.reload();
  }).each(function () {
    var isDarkSkin = Looper.skin === 'dark';
    var $icon = $(this).find('.fa-moon');

    if (isDarkSkin) {
      $icon.addClass('far');
      $icon.removeClass('fas');
    }
  }); // make it global

  return Looper;
}();
 

Это веб-сайт https://worshipground.azurewebsites.net/ Вы можете использовать инструмент инспектор, чтобы убедиться, что blazor правильно загружен и все файлы javascript загружены в /библиотека/javascript и /библиотека/поставщик/…

     <!DOCTYPE html>
<html lang="en">
<head>
    <!-- Required meta tags -->
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <!-- End Required meta tags -->


    <title> Starter Template | Looper - Bootstrap 4 Admin Theme </title>
    <base href="~/" />
    <meta name="theme-color" content="#3063A0">
    <link rel="apple-touch-icon" sizes="144x144" href="Library/apple-touch-icon.png">
    <link rel="shortcut icon" href="Library/favicon.ico">


    <link href="https://fonts.googleapis.com/css?family=Fira Sans:400,500,600" rel="stylesheet">
    <link rel="stylesheet" href="/Library/vendor/open-iconic/font/css/open-iconic-bootstrap.min.css">
    <link rel="stylesheet" href="/Library/vendor/fontawesome/fontawesome-free/css/all.min.css">
    <link rel="stylesheet" href="/Library/stylesheets/theme.min.css" data-skin="default">
    <link rel="stylesheet" href="/Library/stylesheets/theme-dark.min.css" data-skin="dark">
    <link rel="stylesheet" href="/Library/stylesheets/custom-app.css">
    <link rel="stylesheet" href="/Library/stylesheets/custom.css" data-skin="default">
    <link rel="stylesheet" href="/Library/stylesheets/custom-dark.css" data-skin="dark">
    <script>
        var skin = localStorage.getItem('skin') || 'default';
        var isCompact = JSON.parse(localStorage.getItem('hasCompactMenu'));
        var disabledSkinStylesheet = document.querySelector('link[data-skin]:not([data-skin="'   skin   '"])');
        // Disable unused skin immediately
        disabledSkinStylesheet.setAttribute('rel', '');
        disabledSkinStylesheet.setAttribute('disabled', true);
        // add flag class to html immediately
        if (isCompact == true) document.querySelector('html').classList.add('preparing-compact-menu');
    </script>
   
</head>
<body>
    <component type="typeof(App)" render-mode="ServerPrerendered" />

    <div id="blazor-error-ui">
        <environment include="Staging,Production">
            An error has occurred. This application may no longer respond until reloaded.
        </environment>
        <environment include="Development">
            An unhandled exception has occurred. See browser dev tools for details.
        </environment>
        <a href="" class="reload">Reload</a>
        <a class="dismiss">🗙</a>
    </div>





    <script src="/Library/vendor/jquery/jquery.min.js"></script>
    <script src="/Library/vendor/popper.js/umd/popper.min.js"></script>
    <script src="/Library/vendor/bootstrap/js/bootstrap.min.js"></script>
    <script src="/Library/vendor/pace-progress/pace.min.js"></script>
    <script src="/Library/vendor/stacked-menu/js/stacked-menu.min.js"></script>
    <script src="/Library/vendor/perfect-scrollbar/perfect-scrollbar.min.js"></script>
    <script src="/Library/javascript/theme.min.js"></script>
    <script>
        Object.defineProperty(WebSocket, 'OPEN', { value: 1, });
    </script>
    <script src="_framework/blazor.server.js"></script>
</body>
</html>

 

Ответ №1:

Возможно, вы обнаружите, что у вас есть своя работа с точки зрения того, чтобы тяжелый шаблон JavaScript хорошо работал в Blazor.

Вам, вероятно, потребуется использовать IJSRuntime

https://docs.microsoft.com/en-us/aspnet/core/blazor/call-javascript-from-dotnet?view=aspnetcore-5.0

Комментарии:

1. Чего я не понимаю, так это того, что код в bootstrap.js работает нормально, но почему бы не переключить меню гамбургеров, чтобы оно не работало? Хотя я понимаю, почему вы сказали бы «… вероятно, вам нужно использовать IJSRuntime», я не думаю, что это хороший ответ, потому что сама суть вопроса заключается в том, чтобы выяснить, почему это иногда работает, а иногда нет.

2. Проблемы возникают из-за конфликтов между тем, что делают библиотеки JS, и тем, что blazor.server.js делает. Ты строишь дом на полпути. Если у вас есть интенсивная активность по манипулированию JS DOM в компоненте/странице, отображаемой Blazor, удачи, она вам понадобится!

Ответ №2:

Мне кажется, я знаю, откуда берется эта проблема! Если вы закомментируете следующий код в файле «Host.cshtml», эта проблема, скорее всего, исчезнет!

 <script>
    Object.defineProperty(WebSocket, 'OPEN', { value: 1, });
</script>
 

Но!!!! Вместо этого вы получите некоторые ошибки javascript, связанные с «WebSocket»! что-то вроде этого:
«WebSocket не находится в открытом состоянии»
Или
«Не пойманный (в обещании) Ошибка: Не удается отправить данные, если соединение не находится в состоянии «Подключено».»
Причиной этих ошибок является конфликт между «pace.min.js» файл и «blazor.server.js» файл! Вы можете проверить эту ссылку для получения дополнительной информации и получить дополнительную помощь