window.opener = null 的问题...

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了window.opener = null 的问题...相关的知识,希望对你有一定的参考价值。

function closeWindow()

window.opener=null;
window.open('', '_self', '');
window.close();


文章里用这个方法可以无提示进行关闭页面,

问题是运行到 window.open('', '_self', ''); 时不是应该跳转页面,因而没有运行到close吗.也就是直接跳转不进行关闭。

打开一个新的浏览器窗口或查找一个已命名的窗口。
window.open(URL,name,features,replace)

URL:一个可选的字符串,声明了要在新窗口中显示的文档的 URL。如果省略了这个参数,或者它的值是空字符串,那么新窗口就不会显示任何文档。

name:一个可选的字符串,该字符串是一个由逗号分隔的特征列表,其中包括数字、字母和下划线,该字符声明了新窗口的名称。这个名称可以用作标
记 <a> 和 <form> 的属性 target 的值。如果该参数指定了一个已经存在的窗口,那么 open() 方法就
不再创建一个新窗口,而只是返回对指定窗口的引用。在这种情况下,features 将被忽略。

features :一个可选的字符串,声明了新窗口要显示的标准浏览器的特征。如果省略该参数,新窗口将具有所有标准特征。在窗口特征这个表格中,我们对该字符串的格式进行了详细的说明。

replace:一个可选的布尔值。规定了装载到窗口的 URL 是在窗口的浏览历史中创建一个新条目,还是替换浏览历史中的当前条目。支持下面的值:

true - URL 替换浏览历史中的当前条目。
false - URL 在浏览历史中创建新的条目。

url为空的时候,不会打开新窗口,所以执行下面的close
参考技术A 应该是window.opener=&#39;&#39;;window.close();不提示关闭窗口

具有多个子域的 Javascript window.opener.postMessage 跨域

【中文标题】具有多个子域的 Javascript window.opener.postMessage 跨域【英文标题】:Javascript window.opener.postMessage Cross Origin with multiple sub domains 【发布时间】:2019-01-30 19:48:29 【问题描述】:

我正在尝试允许多个子域:

window.opener.postMessage(...);

这可行,但这并不安全,因为所有可能的域都是允许的,我不希望这样:

window.opener.postMessage('MyMSG', '*');

这适用于单个域:

window.opener.postMessage('MyMSG', 'https://example.com');

但如果我想允许这样做:*.example.com 怎么办?

当然是这样:

window.opener.postMessage('MyMSG', '*.example.com');
window.opener.postMessage('MyMSG', 'https://*.example.com');
window.opener.postMessage('MyMSG', 'https://(.*)example.com');

无效

这样做的正确方法是什么?这可能吗?

谢谢

【问题讨论】:

【参考方案1】:

targetOrigin 需要 * 或精确的 uri,即没有子域通配符。

如果您想发布到多个目标,则需要为每个目标单独调用postMessage()。为了使这更容易,您可以将所有域放入一个列表并遍历该列表,而不是对每个调用进行硬编码。

var someData = ;
var subdomains = ["one","two","three"];
for(var subdomain of subdomains)
  let target = "http://"+subdomain+".example.com"
  window.postMessage(someData,target);

但这伴随着保持列表更新的维护成本

现在,根据您的代码在哪一端,您还可以使用某些方法在运行时获取准确的 uri。注意示例使用URL 仅解析协议和主机以获取适当的值以传递给 postMessage。

如果你最后打开了一个窗口,或者 iframe 的父级,你可以只获取 src、href 或任何用于指示窗口、iframe 等的 url 的属性。

//if using for instance window.open()
//you already know the url as it has to be passed to the function
var target = window.open("http://example.com/some/path");

//so in this case you would first save the url to a variable and use that variable for both
var url = new URL("http://example.com/some/path");
var targetDomain = url.protocol + "//" + url.host;

var target = window.open(url.href);
target.postMessage("message",targetDomain);

//if using an iframe just grab the src property and parse the domain from that
var url = new URL(iframeElement.src);
var targetDomain = url.protocol+"//"+url.host;
iframeElement.contentWindow.postMessage("message",targetDomain);

现在,如果您在另一边,即在 iframe 或打开的窗口中,您可以使用document.referrer,但从安全页面打开非安全 URL 时除外。意思是当您的页面使用https:// 时打开http:// url 时不会设置document.referrer

var url = new URL( document.referrer );
var target = url.protocol+"//"+url.host;
//opened window
window.opener.postMessage("message",target);
//iframe
window.parent.postMessage("message",target);

【讨论】:

感谢您的澄清。很有用

以上是关于window.opener = null 的问题...的主要内容,如果未能解决你的问题,请参考以下文章

window.open('',_blank');window.opener=null;top.window.close()和 window.location.href='

js window.open的页面里关闭当前窗口,刷新原来的窗口

Javascript中window.opener的一点小总结

怎样打开当前窗口的父窗口

错误:window.opener 的属性未定义

window.opener和window.open的使用