【 以下文字转载自 Google 讨论区 】
发信人: modico (modico), 信区: Google
标 题: gmail client code review,part 10
发信站: 水木社区 (Mon Oct 23 09:41:14 2006), 站内
看看google如何使用xmlhttp。首先它是如何创建xmlhttp对象的?
function createXmlHttp/*HE*/()
{
var xmlhttp = null;
if (g_uaIsIE/*BG*/) {
var b = g_isIE5x/*BH*/ ? "Microsoft.XMLHTTP" : "Msxml2.XMLHTTP";
try {
xmlhttp = new ActiveXObject(b);
}
catch (c) {
dumpException/*Gz*/(c);
//您需要启用活动脚本功能和activeX 控件。
alertOnceWhenNoXmlHttp/*IE*/("\u60a8\u9700\u8981\u542f\u7528\u6d3b\u52a8\u811a\u672c\u529f\u80fd\u548cactiveX \u63a7\u4ef6\u3002");
}
}
else {
xmlhttp = new XMLHttpRequest;
if (! xmlhttp) {
//此浏览器不支持 XMLHttpRequest。
alertOnceWhenNoXmlHttp/*IE*/("\u6b64\u6d4f\u89c8\u5668\u4e0d\u652f\u6301 XMLHttpRequest\u3002");
}
if (xmlhttp) {
setDefaultXmlHttpCallback/*rZ*/(xmlhttp);
}
}
return xmlhttp;
}
基本上创建xmlhttp是分为IE/非IE两种方式. 它在IE中的创建方式在IE5/6浏览器上实际创建的都是MSXML3的对象,无法利用更新的MSXML版本,意义不是太大。另一种做法是把所有版本从高到低排成一列去测试第一个可用的最高版本,目前google没有这么做。IE部分的出错提示的前半部分活动脚本部分多余,因为若能走到这一步一定是启用了活动脚本。非IE部分的特殊之处在于不管是否异步都设置了一个默认的onreadystatechange的处理函数,该函数在稍后会判断xmlhttp对象上有没有设置 .h 属性,若有则调用,它表示的是实际的处理函数。
alertOnce 这种做法是值得肯定的,它保证了相同的错误只在第一次遇到时报告。
function setDefaultXmlHttpCallback/*rZ*/(xmlhttp)
{
if (g_uaNotIE_KHtml_2/*Es*/) {
xmlhttp.onreadystatechange = function()
{
try {
if (xmlhttp.h) {
xmlhttp.h(xmlhttp);
}
}
catch (b) {
dumpException/*Gz*/(b);
}
if (xmlhttp.readyState == 4) {
xmlhttp.onreadystatechange = doNothing/*Ds*/;
xmlhttp.h = null;
}
}
}
}
var g_noXmlHttpNotAlerted/*TE*/ = true;
function alertOnceWhenNoXmlHttp/*IE*/(a)
{
if (g_noXmlHttpNotAlerted/*TE*/) {
_alert/*C*/(a);
}
g_noXmlHttpNotAlerted/*TE*/ = false;
}
doNothing 是个空函数。
所有的onreadystatechange处理函数都要在结束前重置onreadystatechange为一个空函数,因为实际处理函数很有可能是个closure。清除重置动作可以切断潜在的循环引用链,以防止内存泄漏。赋空函数而不是赋null的原因是null是无效参数。
--
FROM 218.249.84.*