【问题标题】:How can I retrieve the URL of a previously opened window?如何检索以前打开的窗口的 URL?
【发布时间】:2014-07-24 01:39:55
【问题描述】:

我正在打开一个这样的窗口:

var w = window.open("", "window-name", opts);

然后我使用一些动态数据创建一个 URL 并将窗口设置为该 URL,如下所示:

w.location.href = url;

我的问题是我需要检索之前设置到窗口的 URL 以便稍后进行编辑。这样做不起作用:

var url = w.location.href;

因为在我的情况下这违反了安全性并触发了异常。

我不能只将 URL 保存为“全局”变量,因为这需要跨页面工作。我不想使用 cookie,因为当窗口关闭时,URL应该被重置。使用 cookie 会增加更多复杂性,因为它会迫使我在窗口关闭之前进行清理,并且会增加错误风险。我会用它作为最后的手段。

在将 URL 设置为不同域上的某个内容后,有什么方法可以检索窗口实例的 URL?

【问题讨论】:

  • 如果不设置过期时间,则窗口关闭时不需要清理cookie。这会将 cookie 设置为在浏览器会话结束时过期,以便浏览器为您清理它。在任何情况下,我能想到的唯一另一件事就是使用服务器端会话 var 将 url 从一个页面保存到另一个页面(例如,作为 js var 输出)。
  • 或者,您可以将 url 作为 url=[url] 参数传递给每个页面。但这也可能很快变得非常混乱。或者你可以使用sessionStorage 虽然它是 html5 所以可能对你来说不够兼容
  • @CrayonViolent:每次关闭弹出窗口时都必须清除 cookie。只要弹出窗口打开,我收集的数据就应该持续存在,这就是为什么保存数据在窗口引用上本来是完美的,如果不是因为安全违规。

标签: javascript browser browser-history browser-tab


【解决方案1】:

浏览器不会告诉您以前访问过的其他域的 URL 的状态。出于安全原因,会发生这种情况。

如果您在同一个域上工作,也许您可​​以查询History API 以获得您需要的内容。或者,您可以通过 LocalStorage 或其他解决方案将访问过的 URL 存储在客户端上。

【讨论】:

    【解决方案2】:

    像这样使用window.name 属性...

    var w = window.open('http://www.example.com', 'www.previousurlhere.com', opts);
    

    然后,当新窗口打开时(假设它是您的),您可以从新窗口中获取 window.name 数据,例如...

    var previousUrl = window.name;
    

    应该这样做。

    【讨论】:

    • 但是我应该如何从另一个浏览器页面检索窗口引用呢?我不能有一个动态生成的窗口名称,它必须是静态的,比如“my-popup”。
    • 恐怕我无法想象您的目标。似乎您要从弹出窗口中确定“谁是我的制造者?”所以我的建议是将制造商的名称(URL)放入window.open 函数的name 属性中。这样做意味着每个弹出窗口的创建都知道其制造商的名称。这不是目标吗?
    • 不,我不是想确定弹出窗口的制造者,我只是想获取弹出窗口的当前 URL。使用窗口的 name 属性来保存 URL 是不可替代的,因为 name 必须是一个常量值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-29
    • 1970-01-01
    • 1970-01-01
    • 2011-04-25
    • 1970-01-01
    • 2017-12-29
    相关资源
    最近更新 更多