`
toby941
  • 浏览: 26112 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

ActiveX不可用时,你的AJAX会出错么?

    博客分类:
  • web
阅读更多

      最近遇到一个问题,ie6下js可用,但用AJAX做异步请求的时候总是失败,用的是jQuey封装的,报的错误是: Error:Automation 服务器不能创建对象 。查找后发现原来是客户将Internet选项里的安全设置过高,将“对标记为可安全执行的ActiveX控件执行脚本“设置为禁用造成的。

      先来看下jQuery中关于创建XHR对象的代码:

jQuery.js

var xhr = window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest();

 此时的 typeof window.ActiveXObject会返回一个function ,但new ActiveXObject("Microsoft.XMLHTTP")时就会产生上面的异常,问题到此基本知道原因了,本着举一反三的精神,找了下其他js框架创建XHR对象的方法



prototype.js

var Ajax = {
  getTransport: function() {
    return Try.these(
      function() {return new XMLHttpRequest()},
      function() {return new ActiveXObject('Msxml2.XMLHTTP')},
      function() {return new ActiveXObject('Microsoft.XMLHTTP')}
    ) || false;
  },
  activeRequestCount: 0
};

 

mootools.js

Browser.Request = function(){
    return $try(function(){
        return new XMLHttpRequest();
    }, function(){
        return new ActiveXObject('MSXML2.XMLHTTP');
    });
};
 


dojo.js

  d._XMLHTTP_PROGIDS = ['Msxml2.XMLHTTP', 'Microsoft.XMLHTTP', 'Msxml2.XMLHTTP.4.0'];
    d._xhrObj = function(){
            // summary:
            //        does the work of portably generating a new XMLHTTPRequest
            //        object.
            var http = null;
            var last_e = null;
            if(!dojo.isIE || !dojo.config.ieForceActiveXXhr
){
                try{ http = new XMLHttpRequest(); }catch(e){}
            }
            if(!http){
                for(var i=0; i<3; ++i){
                    var progid = d._XMLHTTP_PROGIDS[i];
                    try{
                        http = new ActiveXObject(progid);
                    }catch(e){
                        last_e = e;
                    }
                    if(http){
                        d._XMLHTTP_PROGIDS = [progid];  // so faster next time
                        break;
                    }
                }
            }
            if(!http){
                throw new Error("XMLHTTP not available: "+last_e);
            }
            return http; // XMLHTTPRequest instance
        }

 关于 dojo.config.ieForceActiveXXhr

 

        //Workaround to get local file loads of dojo to work on IE 7
        //by forcing to not use native xhr.
        if(dojo.isIE && window.location.protocol 
=== "file:"){
            dojo.config.ieForceActiveXXhr=true;
        }

    关于window.location.protocol

 

  The URL protocol section including the colon after the protocol name.
        The values are normally http: or file:. The following JavaScript code
        may be used to identify the source of the URL.
        switch (window.location.protocol)
                {
                   case "http:":
                      document.write("From Web<BR>\n")
                      break
                   case "file:":
                      document.write("From Local computer<BR>\n")
                      break
                   default:
                      document.write("Unknown Source<BR>\n")
                      break
                }

    这里需要解释下,从ie7开始加入了对原生的XMLHttpRequest的支持,即ie7以后的版本中对于XHR对象的创建即可以通过ActiveXObject也可以通过直接的new XMLHttpRequest()实现,但是出于安全考虑, ie7的原生XHR是不支持本地使用的,所以在这段js中如果检测但浏览器版本是ie7并且是本地请求创建XHR对象则还是用ActiveXObject来实现的。

(这个细节就是体现js框架差距的地方吧 O(∩_∩)O)
       
YUI:

connection.js
/*
_msxml_progid:[
        'Microsoft.XMLHTTP',
        'MSXML2.XMLHTTP.3.0',
        'MSXML2.XMLHTTP'
        ]

*/
createXhrObject:function(transactionId)
    {
        var obj,http;
        try
        {
            // Instantiates XMLHttpRequest in non-IE browsers and assigns to http.
            http = new XMLHttpRequest();
            //  Object literal with http and tId properties
            obj = { conn:http, tId:transactionId };
            YAHOO.log('XHR object created for transaction ' + transactionId, 'info', 'Connection');
        }
        catch(e)
        {
            for(var i=0; i<this._msxml_progid.length; ++i){
                try
                {
                    // Instantiates XMLHttpRequest for IE and assign to http
                    http = new ActiveXObject(this._msxml_progid[i]);
                    //  Object literal with conn and tId properties
                    obj = { conn:http, tId:transactionId };
                    YAHOO.log('ActiveX XHR object created for transaction ' + transactionId, 'info', 'Connection');
                    break;
                }
                catch(e2){}
            }
        }
        finally
        {
            return obj;
        }
    }

  关于{'Microsoft.XMLHTTP','MSXML2.XMLHTTP.3.0','MSXML2.XMLHTTP','Msxml2.XMLHTTP.4.0' ...}这些proGid的区别以及为什么框架们要一遍一遍的去尝试的意义请参考

 

 Difference between MSXML2.XmlHttp and Microsoft.XmlHttp ProgIDs

  (微软真的害人啊 )


   对比这5个主流的框架可以从代码风格上看出点东西:

     1)jQuery受欢迎是有道理的:能一行代码搞定的东西,用起来学起来都方便,即使偶然极端情况下会出错,可我们的原则就是花最少精力去解决大部分的问题,剩下的一小部分问题,交给那20%倒霉的程序员吧。

     2)相互借鉴,发扬光大,站在巨人的肩膀上...都很适合开源的。

     3)想做大做强就必须有条条框框的束缚。(所以还是喜欢jquery的简单)

     3) Dojo应该是最开发者体验的框架了,甚至读它的源码能扩展一连串的知识,佩服ing,在fireBug控制台下看dojo的类库唰唰的加载多好玩啊:-D

   附件是对于上述几个框架的AJAX简单测试的demo,带各个框架的源码,可当个简易教程,并附加DojoToolbox.air

   方便想了解的的同学们~~O(∩_∩)O

分享到:
评论

相关推荐

    Ajax用户注册,可测试

    Ajax(异步JavaScript和XML)是一种在无需刷新整个网页的情况下,能够更新部分网页的技术。它通过在后台与服务器进行少量数据交换,使网页实现局部刷新,提升了用户体验。在这个"Ajax用户注册"的案例中,我们将重点...

    支持pyramid2.x的kotti web代码

    Kotti 是一个基于 Pyramid 框架的 Python 内容管理系统(CMS),适合用来搭建中小型网站、文档库、企业展示平台、知识库等需要灵活内容结构和权限模型的项目。它本身更像一个可以二次开发的 CMS 框架,比 WordPress、Drupal 这类“一装就用”的系统更倾向于开发者定制和扩展。 这是支持pyramid2.x版本的kotti! tar -xzvf kotti1.0.tar.gz 解压缩 进入目录执行 pip install -e . 来安装, 然后执行pserve app.ini 启动。 用浏览器浏览127.0.0.1:5000 即可浏览。 用户名admin ,口令qwerty

    cmd-bat-批处理-脚本-hello world.zip

    cmd-bat-批处理-脚本-hello world.zip

    知识付费系统自动采集V3.0 跳转不卡顿+搭建教程

    知识付费系统自动采集V3.0 跳转不卡顿+搭建教程,不和外面的一样跳转卡顿,这个跳转不卡顿,支持三级分销。

    基于Matlab实现图像形状纹理颜色特征提取

    在Matlab环境下,对图像进行特征提取时,主要涵盖形状、纹理以及颜色这三大关键特征。其中,对于纹理特征的提取,采用灰度梯度共生矩阵这一方法来实现。通过灰度梯度共生矩阵,可以有效地捕捉图像中像素灰度值之间在不同方向和距离上的相互关系,进而量化地反映出图像的纹理特性,为后续的图像分析、分类等任务提供重要的纹理信息依据。

    实证数据-2010-2023年上市公司-管理层情感语调数据-社科经管.rar

    该数据集为2010-2023年中国A股上市公司管理层情感语调的年度面板数据,覆盖45,320条样本,数据源自年报及半年报的"管理层讨论与分析"部分。通过构建中文金融情感词典(融合《知网情感分析用词典》与L&M金融词汇表),采用文本分析方法计算情感语调指标,包括:正面/负面词汇数量、文本相似度、情感语调1((积极词-消极词)/总词数)和情感语调2((积极词-消极词)/(积极词+消极词))。同时包含盈利预测偏差、审计意见类型等衍生指标,可用于研究信息披露质量、市场反应及代理问题。该数据复刻了《管理世界》《财经研究》等期刊的变量构建方法,被应用于分析语调操纵对债券市场的影响,学术常用度与稀缺度较高。

    cmd-bat-批处理-脚本-FTIME.zip

    cmd-bat-批处理-脚本-FTIME.zip

    1747829038637.png

    1747829038637.png

    2025年自动化X光检查机项目大数据研究报告.docx

    2025年自动化X光检查机项目大数据研究报告.docx

    基于Logisim的原码与补码一位乘法器设计

    在计算机组成原理课程设计中,我全程跟随老师的指导,独立完成了以下两项任务:一是利用Logisim软件进行原码一位乘法器的仿真设计,通过逐步搭建电路、配置逻辑单元,实现了原码乘法运算的完整流程,深入理解了原码乘法的原理和实现机制;二是完成了补码一位乘法器的Logisim仿真,同样按照老师讲解的步骤,精心设计电路,确保补码乘法运算的正确性,进一步掌握了补码乘法的运算规则和电路实现方法。通过这两个项目,我不仅巩固了理论知识,还提升了动手实践能力和逻辑思维能力。

    cmd-bat-批处理-脚本-msvc2017.zip

    cmd-bat-批处理-脚本-msvc2017.zip

    cmd-bat-批处理-脚本-virtualcam-install.zip

    cmd-bat-批处理-脚本-virtualcam-install.zip

    二十四节气之立秋介绍.pptx

    二十四节气之立秋介绍.pptx

    cmd-bat-批处理-脚本-shift.zip

    cmd-bat-批处理-脚本-shift.zip

    二十四节气之小雪介绍.pptx

    二十四节气之小雪介绍.pptx

    java、SpringBoot面试专题,6页面试题

    java、SpringBoot面试专题,6页面试题

    cmd-bat-批处理-脚本-GenerateUnionWinMD.zip

    cmd-bat-批处理-脚本-GenerateUnionWinMD.zip

    二十四节气之大暑节气.pptx

    二十四节气之大暑节气.pptx

    python实现五子棋游戏源码

    python实现五子棋游戏源码

Global site tag (gtag.js) - Google Analytics