最近遇到一个问题,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部件不能创建对象”是一个相对常见的问题。这种错误通常发生在试图加载或使用一个ActiveX控件时,而该控件由于某些原因...
当你尝试运行一个依赖于特定ActiveX控件的应用程序时,如果系统中缺少该控件或者控件存在故障,可能会遇到“ActiveX部件不能创建对象”的错误。这个错误通常会在网页或本地应用程序尝试加载ActiveX组件但无法成功时...
本篇文章将深入探讨“ActiveX控件执行时不弹出安全性提示”这一主题,以及如何实现这一功能。 首先,ActiveX控件在执行时通常会弹出安全性提示,这是为了保护用户的系统免受恶意代码的侵害。当用户访问包含ActiveX...
例如,一个按钮控件可能有Caption属性(显示的文本),Click事件(被点击时触发)和Enabled方法(控制按钮是否可用)。 5. **注册和使用**:完成控件开发后,需要将其注册到系统中,这样其他应用程序才能找到并使用...
* onreadystatechange:存储函数(或函数名),每当 readyState 属性改变时,就会调用该函数 * readyState:存有 XMLHttpRequest 的状态,从 0 到 4 发生变化 * status:存有服务器的状态码 * statusText:存有...
然而,“ActiveX控件不能例示”这一问题可能是许多用户在尝试使用这些控件时遇到的常见问题。 标题中的“ActiveX控件不能例示”意味着在尝试实例化或加载ActiveX控件时遇到了故障。这可能由多种原因引起,包括但不...
当我们创建一个MFC ActiveX控件项目时,Visual C++ 6.0会自动生成一系列的源代码文件,其中包括"winocc.cpp"。这个文件主要处理与ActiveX控件的容器(如IE浏览器或其他支持ActiveX的应用程序)之间的交互。当出现...
当用户尝试将.crx文件添加到Chrome时,可能会遇到安装失败的情况。在这种情况下,解压文件并手动进行配置成为了一种解决方案。正如描述中提到的,你可以从http://www.cnplugins.com/zhuanti/newinstall.html找到详细...
然而,在实际应用中,用户可能会遇到“金蝶K3_ActiveX部件不能创建对象”的问题,这通常是由于ActiveX控件注册失败或系统环境配置不当所致。本文将详细介绍这一问题的成因及提供一个综合性的解决方案。 #### ...
### Java调用ActiveX控件:深入解析与实践 #### 引言 在Web开发的早期阶段,跨平台兼容性是一大挑战。为了解决这一问题,开发者们探索了多种技术,其中一种便是通过Java调用ActiveX控件。本文将深入探讨如何在Java...
然而,由于安全原因,Chrome默认不支持ActiveX插件,因为ActiveX主要在Internet Explorer中使用,它允许网页内容与用户的本地系统进行交互,这可能带来潜在的安全风险。但有时在特定的工作环境中,例如在企业内部...
然而,DLL调用时遇到问题并不罕见,尤其是对于初学者或不熟悉DLL机制的开发者来说。本文将深入探讨DLL调用错误的常见原因及解决方案。 首先,我们需要理解DLL的工作原理。DLL文件包含可执行代码和数据,当一个应用...
3. **示例**:在提供的"callJS"文件中,可能包含了一个示例,演示如何从ActiveX控件调用JavaScript函数,或者反之,这在需要利用ActiveX的强大功能但又希望在网页上保持用户友好交互时非常有用。 **应用场景**: - ...
"ArcMap启动出错“ActiveX部件不能创建对象”问题解决" ArcMap是Esri公司开发的一款GIS(Geographic Information System,地理信息系统)软件,广泛应用于地理信息处理、空间分析、制图和数据管理等领域。然而,在...
昨天,我在安装U871客户端时,遇到了一个问题:ActiveX部件不能创建对象!我尝试了多种方法,包括删除重新安装系统、删除用友通、检查服务器客户端等,但是问题依旧。 分析过程 1. 删除重新安装系统:我删除了整个...
ActiveX部件不能创建对象!提示报错 解决工具
然而,在某些情况下,可能会遇到ActiveX控件无法正常加载或注册的问题,即所谓的“ActiveX 控件Chart不能例示”。 **问题原因:** 1. **注册表问题**:ActiveX控件在系统中的注册信息可能缺失或损坏。 2. **权限...
用户在访问某些网站时,可能会提示下载并安装ACTIVEX控件,以便完整体验网页功能。 然而,ACTIVEX控件的安全性是其一大问题。由于它们可以直接在用户的计算机上执行代码,这为恶意软件提供了潜在的入口点。因此,...
在使用ActiveX Control Test Container 2010时,开发者首先需要创建或获取一个ActiveX控件的库文件(.ocx或.dll)。然后,在测试容器中加载该控件,容器会模拟实际运行环境,提供各种接口和事件来测试控件的各种属性...