ie6,7 location.href 没有权限的出现原因及解决方案 QA 给我提了个bug,说是页面在ie7下点击切换语言报了个js错误。于是在办公网配上开发机host便用ie8的ie7模式看了下,一切正常,到qa同事机器看了下,确 实报js错误。。。看来只有纯ie7才会有这个问题。回到座位开启虚拟机,用ie7试了下首页,果然可以重现, permission declined。以下是切换语言代码:
if (lang && lang !== __Config.current_lang && lists[lang]){
var reg_lang = /(&|\?)(lang=)[^&]*(&|$)/g;
location.href = (location.href.replace(reg_lang, '$1').replace(/#.*$/,'') + '&lang=' + lang).replace(/&+/g, '&').replace(/\/&/,'/?');
} 看了下唯一可能出问题的就是location.href这里,去掉location.href = (location.href.replace(reg_lang, '$1').replace(/#.*$/,'') + '&lang=' + lang).replace(/&+/g, '&').replace(/\/&/,'/?');果然没有报错了。这就奇怪了,首页就在顶级域名xx.com下,没有任何跨域的可能。于是新建了一个测试页面把代码贴进去,一切正常。。。那究竟是哪里出问题呢,回头继续看代码,首页为了增加feedback,弄了个iframe把feedback.xx.com下一个页面加载进来,而该页面在提交feedback成功后会调用父页面的关闭弹出层方法,由于跨域原因父页面与该子页面都加入了document.domain='xx.com'这句,而这句正是与测试页面不同的地方,于是乎在首页试着把document.domain='xx.com'去掉,语言切换正常了,但feedbak子页面提交后弹出层不能关闭了,由于跨域。猜想在测试页面加上document.domain='xx.com'应该也会报没权限吧,试了下结果竟然还是正常。。。还有什么不同???难道是jquery?测试页面没有引入,抱着试试看的态度把jquery 1.71加进去,wow,测试页面终于报错了。坑爹啊,jquery究竟做了什么?网上找了几乎没啥资料,总不能让我把jquery从首页去掉吧,实在没有头绪,这个切换语言必须要获取当前页面url才能做。接着再试,发现在主页设置documen.domain之前是可以获取到location.href的,这样看起来还不错,那在设置domain后不能读,是否可以设置呢?试了下ok,这样的话不完美解决方案产生了,在设置domain前先用个变量存储当前页面url,在设置的时候直接用,这样可以避开ie 7 location.href的读取权限问题。
想了下如果页面的hash变了,而hash的改变并不会刷新页面,这样我之前获取的url就不准确了,肿么办?不知道,郁闷中抄起一根精白沙走到了吸烟区,点上,慢慢踱步,是不是还有其他方法获取当前页面url呢?突然灵光一现,document.URL是不是可以呢?狠狠的掐灭烟头,奔回座位在测试页面试了下没报脚本错误,顺利取到了当前页面url。
总结如下:
在ie6,7页面下如果设置domain如与当前域相同,且引入了jquery(我试了1.4.2, 1.7.1, 1.8.1)取location.href会报没有权限的错误。
解决方案:
用documen.URL代替(document.URL 取值时等价于 window.location.href 或 document.location.href。在某些浏览器中通过对 document.URL 赋值来实现页面跳转,但某些浏览器中不行)。
最后附上几段测试代码,测试环境虚拟机中,ie6,7
成功,设置domain,引入jquery,用document.URL,用document.URL在下面几种情况都ok;
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<input id="test" type="button" value="test" onclick="test()" />
<script src="http://www.xx.com/wechat_portal/js/jquery.js"></script>
<script>
document.domain = "xx.com";
function test() {
document.getElementById('test').value = document.URL;
}
</script>
</body>
</html>
失败, 设置domain,引入jquery,用location.href;
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<input id="test" type="button" value="test" onclick="test()" />
<script src="http://www.xx.com/wechat_portal/js/jquery.js"></script>
<script>
document.domain = "xx.com";
function test() {
document.getElementById('test').value = location.href;
}
</script>
</body>
</html>
成功,设置domain,不引入jquery,用location.href;
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<input id="test" type="button" value="test" onclick="test()" />
<script>
document.domain = "xx.com";
function test() {
document.getElementById('test').value = location.href;
}
</script>
</body>
</html>
成功,不设置domain,引入jquery,用location.href;
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<input id="test" type="button" value="test" onclick="test()" />
<script src="http://www.xx.com/js/jquery.js"></script>
<script>
function test() {
document.getElementById('test').value = location.href;
}
</script>
</body>
</html>
分享到:
相关推荐
### 关于`top.location.href`与`location.href`的区别及应用 #### 一、基本概念理解 在Web开发中,`window.location`对象用于获取或设置当前浏览器窗口的位置信息,而`window.location.href`则用来获取或设置当前...
通过本文的介绍,我们可以看到`window.location.href`不仅能够实现简单的页面跳转,还能灵活地应用于复杂框架结构中的页面跳转及刷新。相比`Response.Redirect`,`window.location.href`提供了更多的灵活性和定制化...
详解 JS location.href 和 window.open 的几种用法和区别 location.href 和 window.open 是 JavaScript 中两个常用的方法,用于控制浏览器的导航和窗口操作。它们的用法和区别是很多开发者需要了解和掌握的知识点。...
但这种方法并不直接解决 `top.location.href` 的权限问题,而是为跨域通信提供了一种替代方案。 总结来说,解决 `top.location.href` 没有权限的问题,主要是理解和应对同源策略的限制。通过尝试访问和异常处理,...
“[removed].href”、”location.href”是本页面跳转 “parent.location.href”是上一层页面跳转 “top.location.href”是最外层的页面跳转 举例说明: 如果A,B,C,D都是jsp,D是C的iframe,C是B的iframe,B是A的...
window.opener.location.href = window.opener.location.href 刷新以winodw.showModelDialog()方法打开的窗口 window.parent.dialogArguments.document.execCommand('Refresh'); 或 Response.Write("<script>...
在JavaScript中,`location.href` 是一个非常重要的属性,它用于获取当前页面的完整URL(统一资源定位符),包括协议、主机名、路径、查询字符串和片段标识符。这个属性不仅可以用来读取URL,还可以用来重定向用户到...
在JavaScript中,`location.href` 是一个非常重要的属性,它表示当前页面的完整URL,包括协议、主机名、路径和查询字符串。当我们需要从URL中提取特定参数时,`location.href` 提供了便利的访问方式。在本文中,我们...
input type=”button” value=”添加” onclick=”location.href(‘//www.jb51.net);” /> 测试的时候发现其在IE下是可以用的而firefox则不能使用了。... 代替 location.href(‘url’);” 于是将源程序改为
首先我们了解一下:[removed].href、location.href、self.location.href、parent.location.href、top.location.href他们的区别与联系,简单的说:几种location.href的区别 js实现网页被iframe框架功能 “[removed]....
在IE6浏览器中,开发者经常会遇到一个问题,那就是`window.location.href`无法正常工作,导致页面跳转失效。这个问题主要是由于浏览器的事件处理机制和默认行为的处理方式导致的。本篇文章将深入探讨这个问题的原因...
self.location.href=”/url” 当前页面打开URL页面 location.href=”/url” 当前页面打开URL页面 windows.location.href=”/url” 当前页面打开URL页面,前面三个用法相同。 this.location.href=”/url” 当前页面...
JavaScript 中的 location.reload 和 location.replace 方法的区别 在 JavaScript 中,我们经常使用 location.reload() 和 location.replace() 两个方法来刷新页面或重定向到新的 URL。但是,这两个方法之间有着...
标题提到的问题在于,当在IE浏览器中使用`window.location.href`进行页面跳转时,`Referer`头字段可能不会被正确地发送。这导致了在服务器端无法获取到用户来源页面的信息。而通过在`<a>`标签中设置链接并触发点击...
本文将探讨这个问题的原因及解决方案。 首先,我们需要理解`window.location.href`的工作原理。它是JavaScript中用于改变当前窗口或框架的URL并加载新文档的属性。当调用`window.location.href`时,浏览器会发起一...
在JavaScript中,`document.URL` 和 `window.location.href` 都是用来获取当前页面URL的属性,但它们之间存在微妙的区别。这两个属性虽然在大多数情况下返回的值相同,但在特定的场景下,它们的表现可能会有所不同。...