项目场景:
主要是通过获取location.origin当同源策略跳转打开新页面。
问题描述
跳转地址会出现 http://localhost:8000/baidu/undefined/baidu/creation重定向后面会重复拼接还会携带一个undefined
原因分析:
在IE浏览器中,window.origin属性不被支持,而在较新的浏览器(如Chrome, Firefox, Safari等)中中是被支持的。
具体区别列举如下:
IE浏览器中的window.origin属性是只读的,它返回当前文档的源信息,包括协议、主机和端口。例如,如果当前文档的URL是http://www.example.com:8080/index.html,那么window.origin将返回"http://www.example.com:8080"。在IE浏览器中,window.origin属性是只读的,不能被修改。
在较新的浏览器(如Chrome, Firefox, Safari等)中的window.origin属性也返回当前文档的源信息,但是它是可写的。这意味着在谷歌浏览器中,你可以通过修改window.origin属性来模拟不同的源。然而,需要注意的是,这个属性只在同源策略允许的情况下才能被修改。
综上所述,IE浏览器和在较新的浏览器(如Chrome, Firefox, Safari等)中的window.origin属性在使用上有一些区别,其中最主要的区别是谷歌浏览器中的window.origin属性是可写的,而IE浏览器中的window.origin属性是只读的
解决方案:
两种写法供参考
在这段代码中,兼容性检查,首先检查
location.origin
是否存在。如果不存在(即在IE浏览器中),我们就使用location.protocol
、location.hostname
和location.port
(如果存在)来构建location.origin
的值。然后,你就可以像在其他浏览器中一样使用location.origin
了。请注意,上述代码应该在你的脚本的顶部或任何需要
location.origin
的地方之前运行,以确保在尝试访问location.origin
之前它已经被正确定义。
let host
if (!window.origin) {
host = window.location.protocol + '//' + window.location.hostname +
(window.location.port ? ':' + window.location.port : '')
} else {
host = window.origin
}
location.origin
在处理同源策略(Same-Origin Policy)相关的跳转时非常有用,因为它提供了当前页面源(包括协议、域名和端口)的完整字符串。然而,由于 Internet Explorer (IE) 不支持location.origin
属性,你需要采取额外的步骤来确保在 IE 中的同源策略跳转也能正常工作。同源策略是一个重要的安全特性,它限制了从一个源(域、协议和端口)加载的文档或脚本如何与来自另一个源的资源进行交互。在进行跨域请求或重定向时,你需要确保源的一致性。
在这个例子中,
redirectToSameOrigin
函数接受一个路径参数,并尝试将浏览器重定向到该路径。它首先检查window.location.origin
是否存在。如果存在,则直接使用它;否则,它手动构建 origin 字符串,并使用该字符串和提供的路径来构建完整的 URL。
function redirectToSameOrigin(path) {
// 如果浏览器支持 location.origin,则直接使用
if (window.location.origin) {
window.location.href = window.location.origin + path;
} else {
// 对于不支持 location.origin 的浏览器(如 IE),手动构建 origin
var protocol = window.location.protocol;
var hostname = window.location.hostname;
var port = window.location.port ? ':' + window.location.port : '';
var origin = protocol + '//' + hostname + port;
window.location.href = origin + path;
}
}
// 使用方法:
redirectToSameOrigin('/some/path'); // 这将重定向到当前源下的 /some/path