4

我有两个网页。在第一页我必须提交一个表格。使用表单中的值(使用嵌入的 JavaScript 代码),我需要生成另一个 JavaScript 文件并在下一页中使用这个生成的 JavaScript 文件。如何才能做到这一点?或者有没有更好的方法来做到这一点?

4

3 回答 3

11

同一产地?

始终允许同一来源的文档相互交互。如果一个窗口或框架中的代码可以引用另一个窗口或框架,并且它们具有相同的来源,那么一个执行上下文(窗口或框架......!)中的 JavaScript 可以与另一个交互。Window当您调用window.open()! 因此,使用该引用在该窗口上设置您想要的任何变量或根据需要加载新脚本。

跨文档消息传递

如果文档的来源不同,或者您没有对其他执行上下文的引用,那么您必须使用 HTML5 中引入的新 API。它被称为“postMessage API”,并且得到了令人惊讶的良好支持。甚至 IE 8 也支持它!

这是检查浏览器是否支持此功能的一种简单方法:

if (typeof window.postMessage !== undefined)
    console.log("postMessage API is supported!");

以下是如何向虚拟收件人发送hello world文本的示例:

window.postMessage("Hello world", "www.dummy.com");

以下是在其他地方托管的另一个 JavaScript 中监听此类消息的方法:

window.addEventListener("message", function(event) {
    if (event.origin === "www.dummy.com")
        console.log("Received message: " + event.data);
    }, true);

IE11 可能对此有一些问题,并且在以前的版本中根本不支持。

动态加载 JavaScript

只要您成功地在两者之间建立了通信通道,并且传递简单的数据还不够,那么您始终可以将完整的 JavaScript 传递给对方并让他执行该脚本。请查看这个stackoverflow 问题和他的相关答案,以了解更多如何在接收端实施这样的解决方案。

当然这些只是一些简短的例子,你应该谷歌搜索其余的。希望它至少可以帮助您找到一条道路。

于 2013-08-01T21:28:45.417 回答
1

您可以通过使用 Blob 来完成您正在寻找的事情。但是,为了在另一个页面上实际运行 JavaScript,您还需要该页面的 HTML。

一个不太干净的例子有效......

var script = function callme(){alert('hi!');};
var html = '<!DOCTYPE html><html><head><script type="text/javascript">'+script.toString()+'</script><body><a onclick="callme();return false;" href="javascript:void(0);">Click me!</a></body></html>';
window.open(URL.createObjectURL(new Blob([html],{type:'text\/html'})));

但它仅适用于较新的浏览器,例如 Chrome 20+、Firefox 13+、IE 10+ 和 Safari 6+。此处有关 Blob 的更多信息:https ://developer.mozilla.org/en-US/docs/Web/API/Blob

于 2013-08-01T21:15:00.390 回答
0

对于这种情况(我很清楚它并不适合所有人),一种可能的选择是走不那么花哨的路线,并将可见页面放入填充视口的 iframe 中;然后让父窗口保留数据。iframe 将从您的第 1 页导航到第 2 页,但由于父窗口不会更改,因此它是一个稳定的存储库,可存储任意多 MB 的 javascript 数据。考虑到所涉及的数据量,这也将比您可以使用的任何其他跨窗口通信技术更简单、更有效,并且它可以在每个浏览器中一直运行到 Netscape Navigator(可能!; -))。

或者对于相关解决方案,在 iframe 中显示第 2 页,该 iframe 再次插入第 1 页,填充屏幕并覆盖现有内容。由于第 1 页仍然存在并且可以与 iframe 共享数据,因此您再次没有问题。

于 2020-07-28T21:51:22.853 回答