1

正如在这个问题这个 bug中所讨论的,共享工作者在 Firefox 57 版本中被严重破坏。基本上,“共享”部分丢失了。它应该工作的方式是在两个选项卡中使用相同的工作脚本创建一个共享工作人员只会创建一个工作人员实例,但在 Firefox 中它会创建两个实例。

任何使用共享工作者的人都熟悉这类问题,因为 IE、Edge 或 Safari 不支持共享工作者。因此,您必须与网络工作者合作。没关系,我可以对有问题的 Firefox 版本做同样的事情,除了......我如何为此进行功能检测,以便在这种情况下发送我的工作人员的非共享版本?

我想我可以使用这样的工人,看看计数器是否在不应该重置的时候重置:

var count = 0; onconnect = function (e) { var port = e.ports[0]; port.postMessage(count); count += 1; }

我的第一个想法是在同一个页面中创建两个共享工作者,看看他们两个的计数器是否都是 0。但事实并非如此。这个:

function createWorker(url, workerNum) {
    var worker = new SharedWorker(url);
    worker.port.onmessage = function (e) {
        console.log("Worker " + workerNum + ": " + e.data);
    };
}

for (var i = 0; i < 2; i++) {
    createWorker("worker.js", i);
}

产生正确的输出:

Worker 0: 0
Worker 1: 1

然后我想也许我可以在同一页面内的两个 iframe 中运行该脚本,但没有骰子,这也是正确的:

Worker 0: 0
Worker 1: 1
Worker 0: 2
Worker 1: 3

如果我在两个选项卡中打开页面,我可以看到问题 - 每个选项卡中的计数器重置为 0。但是如果它需要用户打开一个新标签,它就不是很有用的特征检测。更糟糕的是,该错误似乎是间歇性的。有时,计数器确实会跨标签正确地持续存在!所以这种方法是行不通的......

这似乎是一个非常讨厌的错误来进行特征检测。有没有人有任何想法?还是我卡在解析用户代理字符串?

4

0 回答 0