解决IE浏览器不识别location.origin 的问题

项目场景:

主要是通过获取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.protocollocation.hostnamelocation.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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值