【问题标题】:Can the mechanism that loads the worker in Shared Web Workers be modified?Shared Web Workers中加载worker的机制可以修改吗?
【发布时间】:2016-12-20 15:40:07
【问题描述】:

请参阅此相关问题以了解其背景:

How can I load a shared web worker with a user-script?

考虑到这个问题,我想探索修改 Shared Worker 构造函数的可能性(在用户脚本的上下文中),以便将负责加载 Web Worker 的机制替换为 GM 函数GM_xmlhttpRequest,它的工作原理类似于XMLHttpRequest,但忽略了同源策略。

明确地说,我正在为 Stack Overflow 编写一个用户脚本,以帮助我自己和其他人自动执行某个流程,我需要在两个打开的 SO 选项卡之间进行通信,这可以通过 Shared Web Worker 很好地完成,但是,如果您查看我引用的相关问题,则存在问题。

Shared Web Workers中加载worker的机制可以修改吗?它是使用页面的原生XMLHttpRequest 还是我们无法触及的一些内部功能?如果可以修改,我如何访问它以执行修改?

【问题讨论】:

  • 您也可以使用storage事件在标签之间进行通信。没有尝试过用户脚本,但如果在同一来源,应该可以使用.createObjectURL()
  • @guest271314 哦!我的“B 计划”确实涉及使用本地或会话存储进行通信,但我打算做一些可耻的事情来完成它:以恒定的时间间隔检查变量更改 :( 谢谢,那好多了!
  • stackoverflow.com/questions/38034647/…stackoverflow.com/questions/38343802/…。如果两个标签位于同一来源,也可以使用filesystem:
  • 你想用SharedWorker达到什么目的?
  • @guest271314 只是为了在来自同一域的页面之间传递消息,而无需设置恒定间隔来检查本地存储变量是否已更改。我没有意识到storage 事件到达了域的所有选项卡。考虑到在用户脚本中使用共享工作者的难度,这个选择要简单得多。但是我想有人可能需要在用户脚本中使用共享工作者,所以这个问题可能仍然有用。

标签: javascript userscripts


【解决方案1】:

您想使用SharedWorker 实现什么目标?

在同一域的页面之间传递消息,而不必 设置一个恒定的时间间隔来检查一个本地存储变量是否有 改变了。

您可以使用storage 事件在同一来源的选项卡之间传递消息

index.html

<!DOCTYPE html>
<html>

  <head>
  </head>

  <body>
    <a href="b.html" target="_blank">open b.html</a>
    <textarea></textarea>
    <button>click</button>
    <script>
      var messages = [];
      var button = document.querySelector("button");
      var textarea = document.querySelector("textarea");
      window.addEventListener("storage", function(e) {
        console.log(e.newValue, JSON.parse(localStorage.getItem("messages")));

      });
      button.addEventListener("click", function() {
        messages.push(textarea.value);
        localStorage.setItem("messages", JSON.stringify(messages));
        localStorage.setItem("message", textarea.value);
        textarea.value = "";
      })
    </script>
    </body>
</html>

b.html

<!DOCTYPE html>
<html>

  <head>
  </head>

  <body>
    <textarea></textarea>
    <button>click</button>

    <script>
    var messages = JSON.parse(localStorage.getItem("messages"));
      window.addEventListener("storage", function(e) {
        console.log(e.newValue, JSON.parse(localStorage.getItem("messages")));
      });
      var button = document.querySelector("button");
      var textarea = document.querySelector("textarea");
      button.addEventListener("click", function() {
        messages.push(textarea.value);
        localStorage.setItem("message", textarea.value);
        localStorage.setItem("messages", JSON.stringify(messages));
        textarea.value = "";
      })
    </script>
    </body>
</html>

plnkrhttp://plnkr.co/edit/4nR7Rpu4zXSgTR831vQW?p=preview

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-01
    • 1970-01-01
    • 2012-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多