【转】ie6 sp1+ssl+ajax(XMLHttpRequest) = trouble
遇到status = 12031错误,搜到此文:
在ie6 sp1访问https站点,ajax会随机出现一个winet的状态码:12152。如果你还没有看到过这个困惑的状态码,请参看这里。
这至少可以说明两个问题
- new ActiveXObject(progId)生成的XMLHttpRequest是winet的一部分。MS很喜欢资源重利用,从select这个怪胎就可以看出来了。
- MS ie7以下对ssl的支持不够好。
那么,从上面这样的bad case看来,如何让我没有ajax也能照常用呢?
让我们想想解决方案
解决方案也得从长计议,
1. 出现上述的情况基数人群很少很少,那么均衡整体项目考虑,我们可以短时间内可以不解决这个问题。
2. 无论如何都解决掉这个问题,拔掉牙中这根刺。而我们又不想彻底的抛弃ajax,该怎么办。(因为我们不仅仅只有ie6,MS还有ie7和ie8。所以不能因为 sp1或某些奇怪版本的ie用户而摒弃ajax。)
3. 如果1, 2都不成立,可以直接不用ajax,改用传统的提交方式。
1和3没有什么可说了,第二种情况会更多一些,我们可以:
- 把无刷新页面看做是一个与服务器沟通的桥梁的话,这座桥除了用XMLHttpRequest之外,还可以用iframe。形成一个connection的adapter。
- ajax出现的异常情况下用普通的方式去提交表单。
以下用一点小示例来说明问题用iframe回调的原理:
点击此处http://www.never-online.net/code/js/iframe-callback/default.html 查看示例。
请注意,当你的浏览器是ie6 sp1,装了高级版本的MSXML也是没有用的。因为这是与IE有关,与MSXML的版本没有任何关系。
另外,再加一个比较快速的解决方案
switch(this.requestor.status) { case 12029: case 12030: case 12031: case 12152: case 12159: // fixed ie ssl bug, retry send data var loader = this; setTimeout( function() { loader.execute.call(loader); }, 10); break; default: this.onError(this); }
作者:阿良
出处:http://www.cnblogs.com/arliang
本文采用知识共享署名-非商业性使用-相同方式共享 2.5 中国大陆许可协议
进行许可,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。