ie6 sp1+ssl+ajax(XMLHttpRequest) = trouble

遇到status = 12031错误,搜到此文:


 

在ie6 sp1访问https站点,ajax会随机出现一个winet的状态码:12152。如果你还没有看到过这个困惑的状态码,请参看这里

这至少可以说明两个问题

  • new ActiveXObject(progId)生成的XMLHttpRequest是winet的一部分。MS很喜欢资源重利用,从select这个怪胎就可以看出来了。
  • MS ie7以下对ssl的支持不够好。
纵然ajax带来很好的用户体验,给无数前端开发的人员提供了就业机会。但是我的意见还是坚持的是,在没有ajax的时候,我们的web页面也要能成功的运行。
那么,从上面这样的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.never-online.net/blog/article.asp?id=261

你可能感兴趣的:(XMLhttpREquest)