javascript - Javascript - 将窗口作为变量传递
问题描述
这是我正在尝试做的事情:
当用户注册时,我将当前窗口存储在一个变量中,并向他发送一封电子邮件:
<script>sessionStorage.setItem("window", window)</script> <?php sendEmail(/*...*/); ?>
当用户打开电子邮件时,我从存储中获取先前保存的窗口并关闭它
<script>sessionStorage.getItem("window").close()<script>
这将防止浏览器在同一域上打开太多无用的窗口。
问题是我收到这样的错误:
Uncaught TypeError: sessionStorage.getItem(...).close is not a function
(如果我之前将它存储在变量中,结果相同)
此外,当我记录当前窗口时,我得到一个包含每个方法的对象:
Window {parent: Window, opener: null, top: Window, length: 0, frames: Window, …}
alert: ƒ alert()
...
当我记录存储的函数时,我得到了这个:
[object Window]
有没有办法实现我的目标?
是否可以将窗口作为简单变量传递?
难道我做错了什么?
解决方案
发生这种情况是因为sessionStorage
不存储对象而是字符串。将对象添加到存储中需要做的是在写入时对其进行字符串化,在读取时对其进行解析:
sessionStorage.setItem('test', JSON.stringify({ value: 'this is a test' }))
JSON.parse(sessionStorage.getItem('test'))
虽然这适用于大多数对象,但window
遗憾的是它不是其中之一,因为它包含循环引用(即:它引用自身)您可以在此处阅读有关该问题的更多信息:Stringify DOMWindow object
推荐阅读
- pandas - 计算两个整数列之间的年龄
- r - 如何创建多个新数据集以从选择变量中删除 NA?
- sql - 将所有 SQL Server 代理作业脚本化到单个文件中的 PowerShell 代码
- python - 如何从具有最小库的电表中识别数字?
- winapi - 如何在主线程中使用 IcmpSendEcho2() 和 APC 回调?
- java - 如何获得与 Joda DateTime 后端兼容的完整 HTML 时区选择
- function - Solidity 编程
- parquet - 我可以通过索引访问 Parquet 文件而不将整个文件读入内存吗?
- java - 小时候可以“收养”一个班级吗?
- ubuntu - 我可以通过 Ubuntu 的 nmcli 工具登录我的 VPN,从终端传递用户名和密码吗?