【问题标题】:Javascript - Pass window as a variableJavascript - 将窗口作为变量传递
【发布时间】:2020-08-27 14:16:46
【问题描述】:

这是我想要做的:

  • 当用户注册时,我将当前窗口存储在一个变量中并向他发送电子邮件:

    <script>sessionStorage.setItem("window", window)</script> <?php sendEmail(/*...*/); ?>

  • 当用户打开电子邮件时,我会从存储中获取之前保存的窗口并关闭它

    &lt;script&gt;sessionStorage.getItem("window").close()&lt;script&gt;

这将防止浏览器在同一域上打开太多无用的窗口。

问题是我收到这样的错误:

Uncaught TypeError: sessionStorage.getItem(...).close is not a function

(如果我之前将它存储在变量中,结果相同)


此外,当我记录当前窗口时,我会得到一个包含所有方法的对象:

Window {parent: Window, opener: null, top: Window, length: 0, frames: Window, …}
alert: ƒ alert()
...

当我记录存储的函数时,我得到了这个:

[object Window]

有没有办法实现我的目标?

是否可以将窗口作为简单变量传递?

我做错了吗?

【问题讨论】:

    标签: javascript session window store session-storage


    【解决方案1】:

    这是因为sessionStorage 不存储对象,而是字符串。将对象添加到存储中需要做的是在写入时对其进行字符串化,在读取时对其进行解析:

    sessionStorage.setItem('test', JSON.stringify({ value: 'this is a test' }))
    JSON.parse(sessionStorage.getItem('test'))
    

    虽然这对大多数对象都有效,但很遗憾window 不是其中之一,因为它包含循环引用(即:它引用自身)您可以在此处阅读有关该问题的更多信息:@987654321 @

    【讨论】:

    • 我试过这个:sessionStorage.setItem(\"window\", JSON.stringify({ value: window })) 但它不起作用...this 回答说不可能对窗口进行字符串化...可能是这种情况吗?
    • 您的脚本是否首先打开了窗口?如果没有,那么您无法使用 javascript 关闭它。如果您使用服务工作者,那么您可以使用它来回收您域上打开的所有窗口。
    • @miknik 我没有用 javascript 打开窗口,但我认为因为我是从窗口本身传递变量,所以我可以关闭它...
    • 不,抱歉。见docs
    • @miknik 一种解决方法,例如打开新标签并关闭当前标签?还是放弃更好?
    猜你喜欢
    • 1970-01-01
    • 2021-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-21
    • 1970-01-01
    • 2023-03-11
    相关资源
    最近更新 更多