Blazor 服务器:仅在某些页面上加载 js 脚本,而不是在所有页面上加载 js 脚本

2023-12-27

建议在 _Host.cshtml 中加载 JS 库,而不是在布局中(也不要在不允许的组件中)

但是这样做,怎么可能为一个页面加载一些脚本而为另一个页面加载一些脚本呢?例如。我只想要谷歌地图的东西或数据表的东西只在我使用它们的页面中,而不是全部(浪费空间/内存/加载时间)。

Thanks


正如评论中所讨论的,Blazor 是一个 SPA,因此任何加载的脚本都可以在 Blazor 页面上使用,因为它们是同一页面。

然而,你不have将它们全部列出来_Host.cshtml,事实上,您可能只想在需要时加载特定脚本(例如,并非所有用户都使用需要脚本的特定页面/组件)。

可以使用 JS Interop 动态加载脚本。我创建了以下内容scriptLoader.js库并将其包含在_Host.cshtml:

// loadScript: returns a promise that completes when the script loads
window.loadScript = function (scriptPath) {
    // check list - if already loaded we can ignore
    if (loaded[scriptPath]) {
        console.log(scriptPath + " already loaded");
        // return 'empty' promise
        return new this.Promise(function (resolve, reject) {
            resolve();
        });
    }

    return new Promise(function (resolve, reject) {
        // create JS library script element
        var script = document.createElement("script");
        script.src = scriptPath;
        script.type = "text/javascript";
        console.log(scriptPath + " created");

        // flag as loading/loaded
        loaded[scriptPath] = true;

        // if the script returns okay, return resolve
        script.onload = function () {
            console.log(scriptPath + " loaded ok");
            resolve(scriptPath);
        };

        // if it fails, return reject
        script.onerror = function () {
            console.log(scriptPath + " load failed");
            reject(scriptPath);
        }

        // scripts will load at end of body
        document["body"].appendChild(script);
    });
}
// store list of what scripts we've loaded
loaded = [];

这创建了一个script元素并附加到body文档的元素。它返回一个承诺,因为脚本将异步加载,所以你需要await在 C# 代码中。

The loaded数组的存在是为了避免再次重新加载脚本。任何脚本一旦加载,就会保持加载状态,除非用户刷新页面。所以负载只发生一次。

在我需要确保加载库的页面/组件上,我需要注入IJSruntime...

@inject IJSRuntime jsRuntime

然后就叫它..

    protected override async Task OnAfterRenderAsync(bool firstRender)
    {
        // invoke script loader
        Console.WriteLine("Loading jQuery");
        await jsRuntime.InvokeVoidAsync("loadScript", "https://code.jquery.com/jquery-3.4.1.js");
        await jsRuntime.InvokeVoidAsync("loadScript", "myJQueryTest.js");

        Console.WriteLine("Invoking jQuery");

        await jsRuntime.InvokeVoidAsync("setH1", "Hello world!");

        Console.WriteLine("Invoked JQuery");

        await base.OnAfterRenderAsync(firstRender);
    }

The myJQueryTest.js很简单:

window.setH1 = function (message) {
    $('h1').text(message);
}

创建演示存储库:https://github.com/conficient/BlazorDynamicScriptLoad https://github.com/conficient/BlazorDynamicScriptLoad

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Blazor 服务器:仅在某些页面上加载 js 脚本,而不是在所有页面上加载 js 脚本 的相关文章

随机推荐

  • Slick 3.1 - 检索列的子集作为案例类

    我正在使用 Slick 3 1 1 问题是在某些情况下我想省略一些相当重的列 但仍然将该列的子集具体化为案例类 考虑下面的表定义 class AuditResultTable tag Tag extends Table AuditResul
  • 如何在Unity3d中谷歌表单的另一个部分添加值

    如何在 unity3d 中的 Google 表单的其他部分添加价值 我只能在第 1 部分添加值 在其他部分添加值时遇到问题 这是代码 public GameObject username public GameObject email pu
  • C#中通过名称获取变量

    有没有一种方法可以通过知道变量的名称来获取变量的值 如下所示 double temp double MyClass GetValue VariableName 当我通常像这样访问变量时 double temp MyClass Variabl
  • Windows 窗体的 BackgroundWorker 替代品

    是否可以在 Windows 窗体应用程序中执行类似的操作 我正在尝试寻找其他更新 UI 的方法 而不是一直使用 BackgroundWorker 也许是这样的 public List
  • 从 JAVA 应用程序使用 SSL 连接到 MongoDb

    我有一个MongoDb实例运行 单实例 SSL已启用 我可以通过以下方式连接到它RoboMongo在哪里SSL选项卡我提供以下内容 CA File path to my certificate testCA pem PEM certific
  • C# 中的多页打印文档

    请有人帮助我 我必须在 C 中打印多页文档 我通过互联网然后使用了这段代码但不起作用 打印一页后循环再次开始 private void printDocument1 PrintPage object sender System Drawin
  • 为什么当另一个线程正在运行时 NSTimer 会被阻塞?

    我正在尝试在 iPhone 上的后台运行一项冗长的任务 我开始它performSelectorInBackground 我还创建了一个NSTimer在主线程上只是为了检查事情是否正常 我预计计时器会在另一个线程执行该操作时运行 void v
  • 重写 DeviseController 基类 - Rails 4、Devise 3

    我正在尝试重写设计方法set flash message https github com plataformatec devise blob master app controllers devise controller rb L145
  • Javascript 替换左括号和右括号

    例如 我有一串文本 text1 text2 text3 我想用 替换 字符 用 替换 字符 但仅在这种情况下 当 后面跟着 时 例如 text1 text2 text3 应该导致 text1 text2 text3 如何使用 Javascr
  • 线性布局中按钮的边距

    我正在创建一些按钮并将它们添加到线性布局中 其定义为
  • 如何从自己的类调用扩展方法而不进行强制转换?

    我正在尝试打电话扩展方法在我自己的课程上 但无法编译 考虑以下代码行 public interface IHelloWorld public static class Extensions public static string Hell
  • 我可以将字符串转换为 C# 中的资源位置吗?

    好的 初学者刚刚开始学习编程 尝试用 C 做一些东西 本质上 我有一个字符串 string resourcename example 足够方便的是 我还有一个名为 example jpg 的资源 现在我尝试使用字符串 resourcenam
  • 如何将字符串与前导和尾随条件以及匹配组进行匹配

    我想匹配字符串 USER 前面或后面没有其他引用 我可以对尾随引号使用负前瞻 但无法弄清楚如何实现负后瞻 有了这个字符串 4 NULL AND 3 NULL AND 7 NULL 它应该只匹配第一个 NULL 这是我提出的正则表达式 NUL
  • Android WifiManager 和扫描电池性能

    据我了解 人们可以请求 WifiManager 启动 AP 扫描 这很好 您会收到扫描结果 但我的问题是关于幕后发生的连续 wifi 扫描 除了取消注册用于扫描回调的 wifi 侦听器之外 禁用 wifi 是阻止硬件扫描的唯一方法吗 那么
  • Allure:目标文件夹中的环境文件在 Maven clean 上被删除。如何在每次构建时生成它?

    说明说将environment xml添加到Allure结果目录 https github com allure framework allure core wiki Environment https github com allure
  • 在 __init__() python 中打开文件

    嘿我有以下问题 我需要打开一个文件 init 与check函数我需要检查该文件的行中的字符串 数字是否相同 如果不是 它应该返回True如果是的话它应该返回False 如果没有更多的行None 我不知道文件中有多少行 我的代码工作正常 测试
  • 以编程方式将 WXS 构建到 MSI 中

    我会尽力将其讲清楚 但如果您有疑问或不完全理解 请告诉我 我有一个程序可以从头开始创建 WXS WiX 源代码文件 并对其进行测试以确保其有效 我希望下一个自动步骤是使用 Visual Studio 实际构建 WXS 我正在使用 VS 20
  • 获取 ant.design 表列中另一列的值?

    在我的反应和蚂蚁设计 https ant design 基于应用程序 我有一个包含以下列的表格 const tableColumns title Lorem dataIndex lorem render text gt a href tex
  • 用于 SEO 的最佳 HTML5 语义文章和部分?

    这个问题与文章部分和旁白标签有关 因为它与最佳 SEO 实践相关 我见过一些教程教导您应该放置文章标签并在文章标签内放置各种部分标签 然而 我读过的一些书却有相反的方式 放置部分并嵌套在其中是文章标签 为了获得最佳 SEO 结果 这两种方法
  • Blazor 服务器:仅在某些页面上加载 js 脚本,而不是在所有页面上加载 js 脚本

    建议在 Host cshtml 中加载 JS 库 而不是在布局中 也不要在不允许的组件中 但是这样做 怎么可能为一个页面加载一些脚本而为另一个页面加载一些脚本呢 例如 我只想要谷歌地图的东西或数据表的东西只在我使用它们的页面中 而不是全部