在表单提交时获取_blank目标窗口的参考。

8
我有一个表单,在提交时会打开一个新窗口:
```html

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

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

我想要通过javascript访问新创建的窗口,不需要手动为目标生成唯一名称,也不需要采用其他打开窗口的替代方法
看起来应该有一种简单的方法可以做到这一点,但我没有找到适用于我的特定情况的方法。

1
为什么有人会对这个问题投反对票?至少留下一条评论会很有帮助。请不要假设我没有调查过;而且仅仅因为你不理解导致提出这个问题的情况,这并不代表提问是不合理的。 - jtrick
3个回答

5

如果不使用_blank,你可以给新窗口命名。

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

然后你可以通过以下方式在JS中使用它:

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

谢谢Neal,但正如我在问题中提到的那样,对于我特定的情况,我必须使用target="_blank",最好是“不手动生成唯一名称用于目标,并且不采用其他打开窗口的方法。” - jtrick
尽管我在问题中明确说明了,而且在这里进行了评论,但仍有三个人点赞了这个答案?在正常情况下,我会同意这是最好的方法,这就是为什么我在寻求帮助时特别排除了它。我想做的事情能做到吗?谢谢。 - jtrick
1
@Pointy 感谢你的幽默,当我读到你的评论时,我真的笑出声了。 - jtrick

5
我不确定这个方法在所有浏览器中都适用,但是Firefox似乎会在<a><form>target属性导致新窗口打开时设置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
}

谢谢你,Pointy!这是一个非常有趣的解决方法。 - jtrick
@jtrick 不用谢!就像我说的,我不是非常确定这是否被广泛支持;但可能会有,因为“opener”这个东西真的很老了。在回答你的问题之前,我不知道带有“target”的链接/表单会设置它 :-) - Pointy
这似乎是处理这种情况的最佳方式。尽管window.opener不是官方规范的一部分,但它受到所有主要浏览器的支持,并且不太可能消失... https://developer.mozilla.org/en-US/docs/DOM/window.opener - jtrick

1

对于@Pointy提供的答案,我有一点补充:

在2023年,至少在Chrome浏览器中,当通过<form target="_blank">打开一个新窗口时,window.opener在新窗口中是未定义的。

我不得不在打开的表单中添加rel="opener",之后,window.opener被定义并且可以按照答案中的建议使用。

<form ... target="_blank" rel="opener">

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接