在表单提交时获得对 _blank 目标窗口的引用

Posted

技术标签:

【中文标题】在表单提交时获得对 _blank 目标窗口的引用【英文标题】:obtain reference to _blank target window on form submit 【发布时间】:2012-11-14 05:17:45 【问题描述】:

我有一个在提交时打开一个新窗口的表单:

<form id="form-id" target="_blank">

我想通过 javascript 访问新创建的窗口,无需手动为目标生成唯一名称,也无需使用其他打开窗口的方法

似乎必须有一种简单的方法来做到这一点,但我无法找到适合我特定情况的方法。

【问题讨论】:

为什么有人会否决这个问题?至少评论会有所帮助。不要以为我没有调查过这个;并且仅仅因为您不了解导致问题的情况,这并不能反映提出问题的合理性。 【参考方案1】:

我不能 100% 确定这适用于所有浏览器,但是当 target 上的 target 属性在 &lt;a&gt;&lt;form&gt; 上导致新窗口打开时,Firefox 似乎设置了 window.opener。因此,您可以从另一个方向找到新窗口中的原始窗口(假设您控制那里的代码;如果不是,那么我无法想象您可以对窗口引用做很多事情)。

当然,新窗口中的代码可以做的事情之一是在旧窗口中调用一个函数,并传入它自己的window 引用。

因此,具体来说,如果您有:

<form action=whatever target=_blank>

在原始页面上,然后在新打开的窗口中结束的页面可以这样做:

<head>
  <script>
    if (window.opener) 
      window.opener.announceWindow( window );
    
  </script>

假设announceWindow() 是原始页面上的一个函数,可能类似于:

function announceWindow( win ) 
  // do stuff with "win", a newly-opened window

【讨论】:

谢谢你!这是解决这个问题的一种非常有趣的方法。 @jtrick 不客气!就像我说的,我不确定这是否得到广泛支持。然而,它可能是,因为opener 的东西真的很旧。在我为您的问题尝试之前,我不知道带有“目标”的链接/表单会设置它:-) 这似乎是处理这种情况的最佳方式。看起来虽然 window.opener 不是官方规范的一部分,但它受到所有主流浏览器的支持并且不太可能消失......developer.mozilla.org/en-US/docs/DOM/window.opener【参考方案2】:

代替_blank,您可以使用命名您的新窗口。

 <form id="form-id" target="newName">

然后你可以在 JS 中使用它:

var newWindow = window.open(null, 'newName');

【讨论】:

谢谢尼尔,但正如我在问题中提到的那样,对于特定情况,我必须使用 target="_blank",理想情况下“无需手动为目标生成唯一名称,也无需求助于替代方案打开窗口的方法。” 三个人对这个答案投了赞成票,尽管我在问题中已经明确说了,并且在这里发表了评论?在正常情况下,我会同意这将是最好的方法,这就是为什么我在寻求帮助时特别排除了它的原因。我想做的事可以做吗?谢谢。 @Pointy 谢谢你的幽默,当我读到你的评论时,我真的笑出了声。

以上是关于在表单提交时获得对 _blank 目标窗口的引用的主要内容,如果未能解决你的问题,请参考以下文章

html中target四种选择_blank_parent_self_top,分别是什么意思?

html中target四种选择_blank_parent_self_top,分别是什么意思?

form表单那点事儿(上) 基础篇

form表单那点事儿(上) 基础篇

使用 Capybara,如何切换到带有“_blank”目标的链接的新窗口?

在没有 target="_blank" 的新页面中提交表单