我们可以在浏览器会话中跨网页引用 JavaScript 变量吗?

Can we refer to JavaScript variables across webpages in a browser session?

本文关键字:引用 网页 JavaScript 变量 浏览器 会话 我们      更新时间:2023-09-26

浏览 w3schools JavaScript 教程,找到以下语句:

全局

变量具有全局范围:网页上的所有脚本和函数都可以访问它。

所以,我的问题是,我们有没有办法引用在特定网页中声明的变量?

例如,在 C 中,我们有 extern 关键字,使用它我们可以访问在另一个文件中声明的变量,但我们可以在文件中引用它。

例如:

在 fileA.html 的脚本标签内部,我们已经声明了 var x = 50,在声明之外function(),所以它是全局的 w.r.t fileA.html。如果我有 fileB.html,我们可以从 fileB.html 中体现的脚本标签中引用 x 吗?

需要明确的是,这不是跨网页重用JavaScript文件的场景。

您可以使用Web Workers ; MessageChannel,请参阅如何从另一个 iFrame 中清除 iFrame 的内容;或window.postMessage()在浏览上下文之间通信或传递变量。


一种利用SharedWorker的方法

fileA.html

<!DOCTYPE html>
<html>
  <head>
    <script src="scriptA.js"></script>
  </head>
  <body>
    <a href="fileB.html" target="_blank">fileB</a>
  </body>
</html>

scriptA.js

var x = 50, p;
var worker = new SharedWorker("worker.js");
worker.port.addEventListener("message", function(e) {
  alert(e.data);
  if (!p) {
    p = document.createElement("p");
    p.innerHTML = e.data;
    document.body.appendChild(p)
  }
}, false);
worker.port.start();
console.log("Calling the worker from fileA")
worker.port.postMessage(x); // post `50` to worker

fileB.html

<!DOCTYPE html>
<html>
  <head>
    <link rel="stylesheet" href="style.css">
    <script src="scriptB.js"></script>
  </head>
  <body>
  </body>
</html>

scriptB.js

var x, p;
var worker = new SharedWorker("worker.js");
worker.port.addEventListener("message", function(e) {  
  if (!x && !p) {
    x = e.data; // at `connections`:`1` : `e.data`:`50`
    p = document.createElement("p");
    p.innerHTML = "Message from fileA:" + x;
    document.body.appendChild(p)
  }
}, false);  
worker.port.start();  
console.log("Calling the worker from fileB");
worker.port.postMessage("");

worker.js

self.x = null, connections = 0;
onconnect = function(e) {
  var port = e.ports[0];
  ++connections;
  port.addEventListener("message", function(e) {
    if (!self.x) {
      self.x = e.data;
      port.postMessage("Received:" + self.x 
                       + " from fileA, total connections:" 
                       + connections);
    } else {
      port.postMessage("fileB received:" + self.x 
                       + " total connections:" 
                       + connections);
    }
  });
  port.start();
}

lol No. ;)

当浏览器导航离开页面时,全局范围和所有脚本将在加载下一页之前完全卸载。

允许一个页面访问另一个页面的变量将是一个巨大的安全漏洞。

如果您的网页位于同一域中,它们可以共享一个 localStorage。 您可以将字符串存储在 localStorage 中,并将它们加载到文档就绪上。但是,您需要自己处理并发/读写问题。

"global"是指在声明它们的特定脚本中全局的全局。一旦脚本完成执行,它们就会与除 cookie 之外的所有其他变量一起销毁。

您可以通过 cookie 执行您正在谈论的操作(在网页之间传递值)。它们存储在用户计算机上,除非明确销毁或过期,否则不会销毁。

您可以使用本地存储和会话存储来实现相同的目的。

多核

W3学校

是的

是一种"可能",有一个概念调用ever cookie,即使您从浏览器更改为浏览器,它打算不惜一切代价保留cookie,这个想法是将数据存储在浏览器中的任何可用存储机制(本地存储,cookie,flash cookie,indexDB等)。因此,如果其中一个存储失败,cookie 会从一个位置复制到另一个位置,因此同时一个存储与 cookie 数据一起处于活动状态,这将始终存在。如果用户有Flash Local Shared Object cookie,跨浏览器支持可能会起作用

来源:http://samy.pl/evercookie/

说:我认为使用这种方法不是一个好主意,也许一个简单的localStorage['myvariable'] = {data:"data"}就足够了。