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的页面里关闭当前窗口,刷新原来的窗口