`
toby941
  • 浏览: 25811 次
  • 性别: 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

分享到:
评论

相关推荐

    运行时错误'429':ActiveX部件不能创建对象 解决办法 通用

    在计算机编程与软件开发过程中,经常会遇到各种各样的错误提示,其中“运行时错误'429':ActiveX部件不能创建对象”是一个相对常见的问题。这种错误通常发生在试图加载或使用一个ActiveX控件时,而该控件由于某些原因...

    ActiveX部件不能创建对象解决

    当你尝试运行一个依赖于特定ActiveX控件的应用程序时,如果系统中缺少该控件或者控件存在故障,可能会遇到“ActiveX部件不能创建对象”的错误。这个错误通常会在网页或本地应用程序尝试加载ActiveX组件但无法成功时...

    ActiveX控件执行时不弹出安全性提示

    本篇文章将深入探讨“ActiveX控件执行时不弹出安全性提示”这一主题,以及如何实现这一功能。 首先,ActiveX控件在执行时通常会弹出安全性提示,这是为了保护用户的系统免受恶意代码的侵害。当用户访问包含ActiveX...

    自开发的简单的ActiveX(delphi版)

    例如,一个按钮控件可能有Caption属性(显示的文本),Click事件(被点击时触发)和Enabled方法(控制按钮是否可用)。 5. **注册和使用**:完成控件开发后,需要将其注册到系统中,这样其他应用程序才能找到并使用...

    Ajax简介Ajax.API

    * onreadystatechange:存储函数(或函数名),每当 readyState 属性改变时,就会调用该函数 * readyState:存有 XMLHttpRequest 的状态,从 0 到 4 发生变化 * status:存有服务器的状态码 * statusText:存有...

    ActiveX控件不能例示

    然而,“ActiveX控件不能例示”这一问题可能是许多用户在尝试使用这些控件时遇到的常见问题。 标题中的“ActiveX控件不能例示”意味着在尝试实例化或加载ActiveX控件时遇到了故障。这可能由多种原因引起,包括但不...

    MFC制作ActiveX控件,解决了在实际使用中提示winocc.cpp出错的问题

    当我们创建一个MFC ActiveX控件项目时,Visual C++ 6.0会自动生成一系列的源代码文件,其中包括"winocc.cpp"。这个文件主要处理与ActiveX控件的容器(如IE浏览器或其他支持ActiveX的应用程序)之间的交互。当出现...

    ActiveXforChrome.zip

    当用户尝试将.crx文件添加到Chrome时,可能会遇到安装失败的情况。在这种情况下,解压文件并手动进行配置成为了一种解决方案。正如描述中提到的,你可以从http://www.cnplugins.com/zhuanti/newinstall.html找到详细...

    金蝶K3_ActiveX部件不能创建对象的终极解决方案

    然而,在实际应用中,用户可能会遇到“金蝶K3_ActiveX部件不能创建对象”的问题,这通常是由于ActiveX控件注册失败或系统环境配置不当所致。本文将详细介绍这一问题的成因及提供一个综合性的解决方案。 #### ...

    java调用activex控件

    ### Java调用ActiveX控件:深入解析与实践 #### 引言 在Web开发的早期阶段,跨平台兼容性是一大挑战。为了解决这一问题,开发者们探索了多种技术,其中一种便是通过Java调用ActiveX控件。本文将深入探讨如何在Java...

    chrome 浏览器加载activex

    然而,由于安全原因,Chrome默认不支持ActiveX插件,因为ActiveX主要在Internet Explorer中使用,它允许网页内容与用户的本地系统进行交互,这可能带来潜在的安全风险。但有时在特定的工作环境中,例如在企业内部...

    dll调用时总是出错,高手指教

    然而,DLL调用时遇到问题并不罕见,尤其是对于初学者或不熟悉DLL机制的开发者来说。本文将深入探讨DLL调用错误的常见原因及解决方案。 首先,我们需要理解DLL的工作原理。DLL文件包含可执行代码和数据,当一个应用...

    activex与js交互

    3. **示例**:在提供的"callJS"文件中,可能包含了一个示例,演示如何从ActiveX控件调用JavaScript函数,或者反之,这在需要利用ActiveX的强大功能但又希望在网页上保持用户友好交互时非常有用。 **应用场景**: - ...

    ArcMap启动出错“ActiveX部件不能创建对象”问题解决

    "ArcMap启动出错“ActiveX部件不能创建对象”问题解决" ArcMap是Esri公司开发的一款GIS(Geographic Information System,地理信息系统)软件,广泛应用于地理信息处理、空间分析、制图和数据管理等领域。然而,在...

    Activex部件不能创建对象[收集].pdf

    昨天,我在安装U871客户端时,遇到了一个问题:ActiveX部件不能创建对象!我尝试了多种方法,包括删除重新安装系统、删除用友通、检查服务器客户端等,但是问题依旧。 分析过程 1. 删除重新安装系统:我删除了整个...

    ActiveX部件不能创建对象解决工具

    ActiveX部件不能创建对象!提示报错 解决工具

    ActiveX 控件Chart不能例示

    然而,在某些情况下,可能会遇到ActiveX控件无法正常加载或注册的问题,即所谓的“ActiveX 控件Chart不能例示”。 **问题原因:** 1. **注册表问题**:ActiveX控件在系统中的注册信息可能缺失或损坏。 2. **权限...

    修复ACTIVEX 部件.rar

    用户在访问某些网站时,可能会提示下载并安装ACTIVEX控件,以便完整体验网页功能。 然而,ACTIVEX控件的安全性是其一大问题。由于它们可以直接在用户的计算机上执行代码,这为恶意软件提供了潜在的入口点。因此,...

    ActiveX Control Test Container.(ActiveX插件测试容器2010))

    在使用ActiveX Control Test Container 2010时,开发者首先需要创建或获取一个ActiveX控件的库文件(.ocx或.dll)。然后,在测试容器中加载该控件,容器会模拟实际运行环境,提供各种接口和事件来测试控件的各种属性...

Global site tag (gtag.js) - Google Analytics