IE下使用location对象有时会出现“没有权限”的错误
————————————————————————————————————————————————————————————————
最终我们做了一个测试,很土的方法,在发送PV的地方,加入了很多变量,用于检测代码执行到了哪一步,然后在页面最尾部把这些信息发送到服务器端,看看这 么简单的js哪里出问题了。在最终的log中,终于发现了蛛丝马迹。首先是有问题的那些记录,都是ie,其中ie6占据了90%,ie7占据了将近 10%,只有很少量的是ie8(但浏览器额使用记录上ie6:ie7:ie8应该是4:2:4);这些ie6绝大部分都是xp sp2操作系统;发送PV的方法确实会意外中断。
于是又增加了一些检测,在pv方法上加了一个try catch,然后把错误信息记录下来。日志上显示,发生错误都是一个原因:没有权限(Permission denied)。从网上查了一下,没有权限实在是一个太常见的提示,微软自己都提供了很多更新来解决本不应该出现的“没有权限”问题。很难讲那些10%的 用户是没有安装哪个补丁导致的问题。
PV代码很简单,如下:
(function() {
var a = [], n = document.createElement('script');
a.push('url=' + encodeURIComponent(location.href));
a.push('referrer=' + encodeURIComponent(document.referrer));
n.src = '....pv.gif';
document.getElementsBy
TagName('head')[0].appendChild(n);
})();
最有可能没有权限的代码就是
location,因为之前也遇到过跨域时使用location提示没有权限的问题,因此缩小了范围,把代码改成了:
(function() {
var a = [], n = document.createElement('script');
try {
a.push('url=' + encodeURIComponent(location.href));
} catch (e) {
setTimeout(arguments.callee, 0);
return;
}
a.push('referrer=' + encodeURIComponent(document.referrer));
n.src = '....pv.gif';
document.getElementsBy
TagName('head')[0].appendChild(n);
})();
这 样修改,数据正常了,问题解决了,但缺没有合理的解释,为啥这样使用location会提示没有权限。可能我们的代码有些特殊,上面这段js是放在一个 script标签上,这个标签的最开始还有一段别的代码(当然也很简单),其中会设置一下document.domain,但是设置的 document.domain就是当前的这个域,
而且这个标签放在head标签的最开始,没有什么iframe和 script标签,因此也不会出现多重设置域的问题,
理论上也不会出错。现在的整个片段是这样的:
<head>
<script type="text/javascript">
document.domain = 'bai.sohu.com';
... // 简单代码
(function() {
var a = [], n = document.createElement('script');
try {
a.push('url=' + encodeURIComponent(location.href));
} catch (e) {
setTimeout(arguments.callee, 0);
return;
}
a.push('referrer=' + encodeURIComponent(document.referrer));
n.src = '....pv.gif';
document.getElementsBy
TagName('head')[0].appendChild(n);
})();
</script>
这是啥问题?只能说这是ie的bug,成因为:
1. 代码都在一个script中,并且在一个队列中执行
2. 之前会设置document.domain,并且等于当前的域
3. 后面的代码会使用location对象
如果具备这些条件,那在某些ie下,会报“没有权限”的错误。
有两个解决方法:
1. 使用location时进行try catch,如果发现是没有权限的问题,可以把代码放到下一个执行队列中(setTimeout)
2. 直接放到两个独立的script标签上,一个上设置document.domain,一个是使用location,这样应该也能解决(是根据上面的理论得出,没有经过测试
)
IE下使用location对象有时会出现“没有权限”的错误的更多相关文章
- 使用Location对象查询字符串参数
location是BOM中最有用的对象之一: 1.它提供了与当前窗口中加载的文档有关的信息: 2.他还提供了一些导航功能. location对象的属性有: hash, host, hostname, ...
- BOM之location对象
定义 location提供了与当前窗口中加载的文档有关的信息,还提供了一些导航功能.location是一个很特别的对象,因为它既是window对象的属性,也是document对象的属性.换句话说,wi ...
- Location对象、History对象
Location对象: Window对象的location属性引用的是Location对象,它表示窗口中当前显示的内容的URL,Document对象的location属性也引用Location对象,w ...
- JavaScript window.location对象
JavaScript window.location对象 示例 注意 方法 经常使用window.location,它的结构总是记不住,简单梳理下,方便以后查询. 示例 URL:http://b. ...
- Javascript的location对象
JavaScript window.location对象 示例 注意 方法 经常使用window.location,它的结构总是记不住,简单梳理下,方便以后查询. 示例 URL:http://b.a. ...
- Js之Location对象
Window对象的location属性引用的是Location对象,它表示该窗口中当前显示的文档的URL,并定义了方法来使窗口载入新的文档.Document对象的location属性也引用到Locat ...
- javascript深入之location对象和history对象
浏览器的location 和history对象: 一.location对象: 1>location.reload() 相当于按浏览器上的“刷新”(IE)或“Reload”(Netscape)键. ...
- location对象的属性和方法应用(解析URL)
本文将与大家分享下location对象使用属性和方法来解析URL的实例,感兴趣的朋友可以参考下,希望对你有所帮助 location对象提供了很多属性和方法用来解析URL. 复制代码代码如下: &l ...
- History对象和location对象
history对象 History对象包含用户在浏览器窗口中访问过的url.不是所有浏览器都支持该对象. 属性length 返回浏览器历史列表中的URL数量. 方法:back() 加载histor ...
随机推荐
- 转: 如何从keystore file中查看数字证书信息
转: http://www.shuziqianming.com/201302/certificate-information-in-a-keystore-file/ 如何从keystore file中 ...
- TestNG系列之二:TestNG套件测试
测试套件的测试是为了测试软件程序的行为或一系列行为的情况下,是一个集合.在TestNG,我们不能定义一套测试源代码,但它代表的套件是一个XML文件执行特征.这也允许灵活的配置要运行的测试.套件可以包含 ...
- SOA初探
背景 曾今SOA的概念犹如今日“云计算.大数据”一样,被炒得火热,不少企业便纷纷响应,并宣称会拥抱和实施SOA.而事实上,业界出现了两种极端:一种是由于各类文章和书籍关于SOA的描述往往太过抽象,再加 ...
- 我的Android进阶之旅------>Android字符串资源中的单引號问题error: Apostrophe not preceded by 的解决的方法
刚刚在string字符串资源文件里,写了一个单引號.报错了,错误代码例如以下 error: Apostrophe not preceded by \ (in OuyangPeng's blog ) 资 ...
- jQuery实现滚动栏一直处于最底部
相信大家有时候在展示一些实时数据展示并且数据量非常大的时候,由于无法在同一页面看到最有效的数据,所以我们须要将滚动栏至于底部.以便我们看到最须要的数据和信息.这里非常明显的样例那拿windows的pi ...
- sql查询备份或还原等操作的大概完成时间
查询出来的还需完成时间还算比较准确 --查询备份或还原等操作的大概完成时间 select command ,percent_complete ,running_time))+' hour, ' ))+ ...
- 07-spring学习-bean的其他配置(了解)
首先需要明确,默认情况下,只要在applicationContext.xml文件里面配置的时候自动进行构造方法初始化. 但是用户也可以实现自己的配置,让其在第一次使用的时候进行初始化,这种操作叫做 延 ...
- jquery.validate.js 验证框架详解
项目中遇到这个js框架 jQuery Validate 插件为表单提供了强大的验证功能,让客户端表单验证变得更简单,同时提供了大量的定制选项,满足应用程序各种需求.该插件捆绑了一套有用的验证方法,包括 ...
- 基于委托的C#异步编程的一个小例子 带有回调函数的例子
我创建的是一个winform测试项目:界面如下: 设置: 下面是代码: using System; using System.Collections.Generic; using System.Com ...
- 机器学习实战笔记7(Adaboost)
1:简单概念描写叙述 Adaboost是一种弱学习算法到强学习算法,这里的弱和强学习算法,指的当然都是分类器,首先我们须要简介几个概念. 1:弱学习器:在二分情况下弱分类器的错误率会低于50%. 事实 ...