如何使用用户脚本加载共享 Web Worker?

2023-12-14

我想用用户脚本加载共享工作者。问题是用户脚本是免费的,并且没有托管文件的商业模式 - 我也不想使用服务器(即使是免费的服务器)来托管一个小文件。不管,我尝试过这个我(当然)得到了同源策略错误:

Uncaught SecurityError: Failed to construct 'SharedWorker': Script at
'https://cdn.rawgit.com/viziionary/Nacho-Bot/master/webworker.js'
cannot be accessed from origin 'http://stackoverflow.com'.

还有另一种方法通过将辅助函数转换为字符串然后转换为 Blob 并将其加载为辅助程序来加载网络辅助程序,但我也尝试过:

var sharedWorkers = {};
var startSharedWorker = function(workerFunc){
    var funcString = workerFunc.toString();
    var index = funcString.indexOf('{');
    var funcStringClean = funcString.substring(index + 1, funcString.length - 1);
    var blob = new Blob([funcStringClean], { type: "text/javascript" });
    sharedWorkers.google = new SharedWorker(window.URL.createObjectURL(blob));
    sharedWorkers.google.port.start();
};

这也行不通。为什么?因为共享工作者是shared基于其工作文件加载的位置。自从createObjectURL为每次使用生成唯一的文件名,工作人员永远不会拥有相同的 URL,因此永远不会被共享。

我怎么解决这个问题?


Note:我尝试询问具体的解决方案,但此时我认为 我能做的最好的事情就是以更广泛的方式询问any问题的解决方案,因为我尝试的所有解决方案似乎 由于同源政策或方式根本不可能URL.createObjectURL works (从规格来看,似乎不可能 更改生成的文件 URL)。

话虽这么说,如果我的问题可以以某种方式改进或澄清,请发表评论。


您可以使用fetch(), response.blob()创建一个Blob URL类型的application/javascript从返回的Blob; set SharedWorker()参数为Blob URL由...制作URL.createObjectURL();利用window.open(), load新开业活动window定义相同SharedWorker先前在原始定义window, 附message事件到原始SharedWorker在新开的windows.

javascript被尝试过console at 如何从另一个 iFrame 中清除 iFrame 的内容,其中当前问题 URL 应在新位置加载tab with message从开放window通过worker.port.postMessage()事件处理程序记录于console.

Opening window还应该记录message从新打开的位置发布时发生的事件window using worker.postMessage(/* message */),同样在打开时window

window.worker = void 0, window.so = void 0;

fetch("https://cdn.rawgit.com/viziionary/Nacho-Bot/master/webworker.js")
  .then(response => response.blob())
  .then(script => {
    console.log(script);
    var url = URL.createObjectURL(script);
    window.worker = new SharedWorker(url);
    console.log(worker);
    worker.port.addEventListener("message", (e) => console.log(e.data));
    worker.port.start();

    window.so = window.open("https://stackoverflow.com/questions/" 
                            + "38810002/" 
                            + "how-can-i-load-a-shared-web-worker-" 
                            + "with-a-user-script", "_blank");

    so.addEventListener("load", () => {
      so.worker = worker;
      so.console.log(so.worker);
      so.worker.port.addEventListener("message", (e) => so.console.log(e.data));
      so.worker.port.start();
      so.worker.port.postMessage("hi from " + so.location.href);
    });

    so.addEventListener("load", () => {
      worker.port.postMessage("hello from " + location.href)
    })

  });

At console在任一tab然后你可以使用,例如;在如何从另一个 iFrame 中清除 iFrame 的内容 worker.postMessage("hello, again") at new window当前 URL 的如何使用用户脚本加载共享 Web Worker?, worker.port.postMessage("hi, again"); where message每个附有的事件window, 两者之间的通信windows 可以使用原始的来实现SharedWorker在初始 URL 处创建。

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

如何使用用户脚本加载共享 Web Worker? 的相关文章

随机推荐

  • 为什么 macOS Visual Studio Code 使用错误的 Python 解释器?

    我在 macOS Sierra 10 12 6 上运行 VS Code 1 33 1 当我运行如下所示的简单 Python 程序时 VS Code 使用 Mac 上安装的 Python 2 7 而不是我使用 Homebrew 安装的 Pyt
  • 如何检查文件是否正在使用?

    在尝试打开文件进行读取之前 有什么方法可以先测试文件是否正在使用 例如 如果文件仍在写入或被视为正在使用 则此代码块将引发异常 try FileStream stream new FileStream fullPath FileMode O
  • REST-Endpoint:无返回值的异步执行

    我的问题可能很容易解决 但目前我不明白 在我的 Quarkus App 中 我有一个 REST Endpoint 它应该调用一个方法 不等待结果并立即返回 202 HTTP Statuscode POST Produces MediaTyp
  • Mysqli DELETE QUERY 在 PHP 脚本中不起作用

    我使用下面的代码从表中删除一个条目 我想做的是检查是否从表中删除了任何值 如果删除了一个值 脚本应该打印成功 否则为 false 这是我所实现的 直到现在请帮忙
  • 将声音从左向右移动

    如何将 iPhone 耳机的声音从左移到右 我认为你想要 AVAudioPlayer 的 pan 属性 检查AVAudioPlayer 文档 从 pan 属性 通过设置这个属性你可以 将声音放置在立体声场中 值 1 0 为全左 0 0 为
  • Matlab z buffer 用于模拟kinect

    我们正在尝试模拟简单的 kinect 输出 我已经在 Matlab 中渲染了一个三角形网格 现在我想获取渲染形状的图形 轴的深度缓冲区 我如何在 matlab 中做到这一点 即如何访问图形的深度缓冲区 你可以尝试this
  • IIS 上的 .htaccess 或 .htpasswd 等效项?

    有谁知道 IIS 是否有相当于 htaccess 和 htpassword 的文件 我被要求将一个应用程序迁移到 IIS 该应用程序使用 htaccess 根据 htaccess 文件的内容控制对各种 URL 中的文件集的访问 我进行了谷歌
  • 如何让.net cf中的所有进程都运行

    我想从我的应用程序中获取 Windows Mobile 6 5 中所有正在运行的应用程序的列表 谁能告诉我如何为CF做到这一点 你必须 P 调用工具帮助 API 曾经有一篇 MSDN 文章对此进行了介绍 将其全部放入此处的帖子中有点长 但也
  • 如何根据用户的选择动态生成SQL查询?

    我需要创建一个 GUI 用户可以使用它选择多个属性 这些属性将用于查询数据库以找到合适的人 我正在寻找如何根据用户的选择动态生成数据库查询的想法 查询将包含多个字段 但为了了解这个想法 我将仅包含以下三个字段作为示例 职业 可以有 0 到
  • Spring cloud Stream中的事务

    Problem 我正在尝试逐行读取一个大文件并将消息放入 RabbitMQ 中 我想在文件末尾提交rabbitMQ 如果文件中的任何记录是坏的 那么我想撤销发布到队列的消息 技术 弹簧靴 春云流水 RabbitMQ 您能帮我实现这个过渡吗
  • 在.NET 中读取/保存 PixelFormat.Format48bppRgb PNG 位图?

    我已经能够使用以下 C 代码创建 Format48bppRgb PNG 文件 来自一些内部 HDR 数据 Bitmap bmp16 new Bitmap viewer Width viewer Height System Drawing I
  • 如何在 Linux 中从 C 获取当前时间(以毫秒为单位)?

    如何获取 Linux 上的当前时间 以毫秒为单位 这可以通过使用来实现POSIX clock gettime功能 在当前版本的 POSIX 中 gettimeofday is 标记为过时 这意味着它可能会从规范的未来版本中删除 鼓励应用程序
  • C - 获取用popen打开的进程的PID

    我有一个用 C 编写的程序 它使用 popen 打开另一个程序 我想获取该程序的 pid 或某种处理程序 以便在一定时间限制后 或者在它超出某些 ram 和 stdout 限制时杀死它 我认为这必须用ptrace来完成 它需要PID 但我不
  • x86处理器如何在引导加载程序加载GDT后立即获取指令?

    在为 x86 编写的典型简单引导加载程序中 我们有以下代码来加载 GDT 并执行远跳转 请注意 在执行以下代码之前 CS 为 0x0 lgdt gdtdesc movl cr0 eax orl 1 eax movl eax cr0 Jump
  • 一对多关系中外键始终为空 - Spring Boot Data with JPA

    我有两个实体类Country and Language具有双向一对多关系 下面是实体类 Entity Table name COUNTRY public class Country Id GeneratedValue Column name
  • 有没有办法为 TestNG suite.xml 中包含的方法指定参数?

    我正在为基于 TestNG 的自己的测试框架编写 suite xml 我的 xml 文件如下所示
  • C++ 关键字 auto 有什么作用? [复制]

    这个问题在这里已经有答案了 我最近在c 中遇到了关键字auto 在代码中 auto maxIterator std max element spec 0 spec sampleSize float maxVol maxIterator No
  • Java 构造函数具有比其类更广泛的访问级别

    Java规范允许具有默认访问权限的类对其构造函数进行公共访问 它的目的是什么 因为它不能在其包之外引用 我想将此作为评论 但由于评论中不允许使用代码标签 关于您对 CristopheD 的回答的评论 package bob class My
  • 为什么自定义元素不支持将属性作为对象?

    我试图将自定义元素中的数据属性作为对象传递 但在接收 AttachedCallback 方法内部时以字符串形式获取值 object object 那么任何人都可以帮助我弄清楚如何将属性作为自定义元素 Web 组件 中的对象获取 代码示例
  • 如何使用用户脚本加载共享 Web Worker?

    我想用用户脚本加载共享工作者 问题是用户脚本是免费的 并且没有托管文件的商业模式 我也不想使用服务器 即使是免费的服务器 来托管一个小文件 不管 我尝试过这个我 当然 得到了同源策略错误 Uncaught SecurityError Fai