问题标签 [shared-worker]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1927 浏览

javascript - 如何从网络工作者调用共享工作者?

是否可以从 Web Worker 调用 Shared Worker?

你能给我一个例子吗?

就我而言,我有一些网络工作者,我需要在他们之间共享一个单例服务。

0 投票
0 回答
872 浏览

javascript - 如何在 Shared Worker 中运行 EventSource?

我实现了服务器发送的事件来接收来自服务器的消息。我描述了我如何在另一个问题上实现它

现在我试图在共享工作者中运行它,以防止用户通过多个浏览器选项卡打开到服务器的多个连接。

这是我在 Shared Worker 中运行代码所做的工作

创建了一个文件调用worker.js,我把这段代码放在里面

然后当 HTML 页面加载时,我调用此代码

但是代码没有从服务器返回消息。

如何EventSource在共享工作者中正确运行事件?

0 投票
1 回答
1305 浏览

javascript - 如何在 SharedWorker 中“仅启动一次”服务器发送事件以推送任何打开脚本的消息?

我有一个几乎没有问题的服务器发送事件 (SSE)实现。我遇到的唯一问题是“一个用户可以与服务器建立许多连接”。基本上,如果用户打开多个 Web 浏览器的选项卡,每个选项卡都会向服务器创建一个全新的服务器发送事件请求,这会导致来自单个用户的许多请求运行。

为了解决这个问题,我想在 Javascript 的SharedWorker中运行 SSE 。

这意味着我只有一个 SSE 与 SharedWorker 进行通信。然后,每个页面/Web 浏览器都将与 SharedWorker 进行通信。这给了我每个用户只允许一个 SSE 的优势。

这就是我的 SSE 目前在没有任何类型工人的情况下工作的方式。

我想运行相同的设置。但是,我想在 javascript 的 SharedWorker 中运行它,以消除每个用户拥有多个 SSE。

我正在努力实施 SharedWorker。这是我到目前为止尝试过的

我创建了一个名为worker.js并将此代码添加到其中的文件

然后在我想列出消息的页面上,我有这个代码

我在这里想念什么?

我究竟做错了什么?

如何更正实施?

已编辑

根据@Bergi 下面的评论,这是我的实现的更新版本,它仍然没有向连接器发布消息。我在代码中添加了注释,解释了对代码发生了什么的理解。

在登陆页面上,即index.php我像这样连接到我的 SharedWorker

这是我的worker1.js文件包含的代码

这是我的另一个版本worker1.js

0 投票
1 回答
339 浏览

javascript - 为什么我的 ShardWorker 不在 Firefox 中运行,而是在 Google Chrome 中运行

我终于在 Shared Worker 中实现了运行 Server-Sent Event SSE。此实现允许我将服务器上运行的脚本总数限制为每个用户一个。

但是,我仍然有几个问题。

  1. SharedWorker根本不在 FireFox 中运行,但它在 Google Chrome 中运行。我正在使用 Firefox v40.0。我在控制台中没有收到任何错误。我确实在控制台中看到有关 SSL 证书的警告,但没有错误。这是来自 FireFox 控制台的警告

本网站使用 SHA-1 证书;建议您使用具有比 SHA-1 更强的哈希函数的签名算法的证书。[了解更多]

  1. 似乎ShardWorker在一段时间的空闲时间后停止工作。这不是 PHP 脚本问题,因为脚本在没有共享工作者的情况下工作文件。我在使用 Chrome v44.0 时遇到了这个问题。为了让 shardworker 重新开始,我必须重新加载页面。

我能做些什么来找出可能导致 ShardWorker 停止的原因?为什么不在SharedWorderFireFox 中运行?

这是我的实现

这是代码帽子调用SharedWorker

这是代码worker.js

0 投票
1 回答
797 浏览

javascript - 将可转移对象与共享工作者一起使用

在我的共享工作者中使用可转移对象时,我在主线程中收到nullevent.data经过一番搜索,我发现这篇文章解释说ArrayBuffer当它通过 a 时总是MessagePort丢失MessageChannel

共享工作者通信也使用端口和消息通道完成。这是否意味着无法在SharedWorker实例中使用可转移对象?还是有一些解决方法?

我需要将一个巨大string的从SharedWorkerGlobalScope回传输到主线程。想法是将其转换ArrayBuffer为如本例所示的,然后传输缓冲区。据说这比发送字符串要快得多......

发送数据:

接收数据:

0 投票
1 回答
1532 浏览

javascript - 如何在不包含包装语法的情况下将函数注入脚本标记?

在这种奇怪的情况下,我需要将一个 JS 函数转换为一个字符串,然后将该字符串转换为一个动态生成的<script>标签(它使用类型javascript/worker以便不被执行)。

我正在编写用户脚本,注入代码以在两个第三方站点之间创建共享网络工作者。关于用户脚本的问题是您通常只想使用一个文件来实现脚本的功能,而 web 工作者喜欢为工作者使用单独的 JS 文件。那么有一种方法可以使用 Blob。但是,请记住,我只使用脚本文件,而不是用户脚本的 HTML 文件,所以我想将此部分(共享工作代码)作为函数存储在我的脚本中:

然后使用toString()它,这样我就可以将它注入到第三方页面中动态生成的脚本标签中,所以它最终会像这样结束,而脚本不会调用任何额外的文件:

但是,使用该toString()方法会导致function包含单词,如下例所示:

请记住,我打算将函数附加到带有 type 的脚本标记, javascript/worker而不是text/javascript这样,在将函数转换为 blob 并用作 worker 的文件源之前,该函数不会被执行,但在这里我将使用 text/javascriptso您可以在执行时看到错误。

在此处输入图像描述


只是为了让您了解我在做什么,因为它可能会令人困惑,然后这样的函数会将上述未执行的脚本标记转换为 Blob 并使用它而不是外部文件来创建共享工作者:


那么,如何在不包含函数包装语法(function (){)的情况下将函数的内容注入脚本标签?

0 投票
1 回答
1003 浏览

javascript - 为什么 SharedWorker onConnect 事件有一个 Ports 数组?

在我见过的所有示例中,它们都与此类似

是否存在端口数组将包含多个元素的实例?在 SharedWorker 上使用 chrome://inspect 并打印出来e,我得到

消息事件

无论生成多少个实例共享 SharedWorker,长度始终为 1。为什么它不只是一个 MessageEvent 而不是一个数组?它是一个数组有什么用例?

0 投票
0 回答
175 浏览

jquery - jQuery 和共享工作者

我说 jQuery 不能在Sharedworker中使用是对的吗?共享工作者在浏览器选项卡之外运行,并且无法访问窗口/文档(我知道关闭)所以我认为 jQuery 不会再次工作,我认为它需要访问窗口对象。

以上就是这种情况 - 是否有任何方法或结构可用于修改 jQuery 代码,以便在不访问窗口对象的情况下加载它?

看着 jQuery 代码,我看到了这个 -

所以没有访问窗口或文档,它不能工作?

0 投票
1 回答
740 浏览

javascript - 什么是共享工作者?工人与共享工人之间的区别?

我不得不看共享工作者的例子。但我无法确定工人与共享工人之间的区别。共享工作者示例https://github.com/mdn/simple-shared-worker。谁能解释一下?

0 投票
1 回答
279 浏览

ms-office - window.opener 在 Excel for Windows 中不起作用

我已经构建了一个 Excel 加载项,它打开一个弹出窗口window.open,然后加载项与弹出站点进行通信。我刚刚意识到它在 Excel for Windows 中不起作用,原因是弹出窗口无法通过$window.opener.

为了说明这一点并避免跨域,我做了一个 xml,它指的是加载项测试页面。它在 Chrome 和 IE 中的 Excel Online 中运行良好。但是,在 Excel for Windows 中运行它时,会$window.opener返回undefined.

谁能告诉我发生了什么,解决方法是什么?

(对于推荐 Dialog API 的人,请参阅此线程。所以现在 Dialog 和window.openExcel for Windows 都不起作用)。