用google canlendar的时候,看到了罕见的model对话框,就抓下来看了看
整理了一些代码的排版和一些局部变量的命名,函数是全局的,因为其他部分也可能调用,怕后面找不到没敢改,写了一下建议的命名。分享一下。
主要是XMLHttpRequest部分的,对话框部分倒是也看了,但是还没有完全整理出来。
var XMLHttpStr=["MSXML2.XMLHTTP.5.0",
"MSXML2.XMLHTTP.4.0",
"MSXML2.XMLHTTP.3.0",
"MSXML2.XMLHTTP",
"MICROSOFT.XMLHTTP.1.0",
"MICROSOFT.XMLHTTP.1",
"MICROSOFT.XMLHTTP"];
var ck=undefined;
//创建XMLHttpRequest的ActiveX对象,对象名称(参见XMLHttpStr数组)保存在ck内
//For Safari and Mozilla, a simple call to the object's constructor function does the job:
//var req = new XMLHttpRequest();
//for the ActiveX branch, pass the name of the object to the ActiveX constructor:
//var req = new ActiveXObject("Microsoft.XMLHTTP");
//CreateXMLHttpRequestForActiveX()
function NA()
{
if(typeof XMLHttpRequest=="undefined"&&typeof ActiveXObject!="undefined"){
for(var a=0;a<XMLHttpStr.length;a++){
var b=XMLHttpStr[a];
try{
new ActiveXObject(b);
ck=b;
break
}
catch(c)
{}
}
if(undefined===ck)
{
throw "Could not create ActiveXObject. ActiveX might be disabled, or msxml might not be installed";
}
}
}
NA();
//创建XMLHttpRequest对象
//CreateXMLHttpRequest
function Fm()
{
if(ck!==undefined){
return new ActiveXObject(ck)
}
else{
return new XMLHttpRequest
}
}
//以GET方式发送URL请求
//a: XMLHttpRequest对象
//b: url
//c: 处理响应的函数
//XHR_GetUrl(XHR, Url, Callback)
function Ds(a,b,c)
{
a.onreadystatechange=c;
a.open("GET",b,true);
Fs(a,null)
}
//以GET方式发送URL请求
//a: XMLHttpRequest对象
//b: url
//c:
//d: 处理响应的函数
//XHR_PostUrl(XHR, Url, ???, Callback)
function Es(a,b,c,d)
{
a.onreadystatechange=d;
a.open("POST",b,true);
a.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
a.setRequestHeader("Content-Length",c.length);
Fs(a,c)
}
//XMLHttpRequest对象发送url请求
//XHR_DoSend(XHR, ???)
function Fs(a,b)
{
try{
a.send(b)
}
catch(c){
P("XMLHttpSend failed "+c.toString()+"<br>"+c.stack);
throw c;
}
};
//vt只在Nd(), Fa()两个函数中改变过,都是vt++
//大概是记录通过XMLHttpRequest发送的url的个数
var vt=0;
if("undefined"==typeof P){
P=function(){}
}
//获取XMLHttpRequest的HTTP响应状态码
//a: XMLHttpRequest对象
//XHR_GetStatus(XHR)
function mc(a)
{
var b=-1;
try{
b=a.status
}catch(c)
{}
return b
}
//获取XMLHttpRequest返回的响应是否是javascript脚本
//a: XMLHttpRequest对象
//XHR_IsJavaScript(XHR)
function Bf(a)
{
try{
var b=a.getResponseHeader("Content-Type");
if(b&&(b.indexOf("text/javascript")==0||b.indexOf("application/x-javascript")==0)){
return true
}
}catch(c)
{}
return false
}
//获取XMLHttpRequest的状态码字符串
//a: XMLHttpRequest对象
//XHR_GetStatusText(XHR)
function Lw(a)
{
var b=null;
try{
b=a.statusText
}catch(c)
{}
return b
}
//处理XMLHttpRequest得到的响应
//a: XMLHttpRequest对象
//b:
//c:
//d: 处理接收到的响应的函数?
//这个函数只被Nd(),Fa()调用过
function qp(a,b,c,d)
{
//XMLHttpRequest.readStat的值和含义
//0 = uninitialized
//1 = loading
//2 = loaded
//3 = interactive
//4 = complete
if(a.readyState==4){
var e=true;
if(d){
try{
//调用处理响应的函数?
e=!(false===d(a))
}
catch(f){
P("Message ("+b+") handling failed: "+f);
throw f;
}
}
var g=mc(a); //获取XMLHttpRequest的http响应码
if(200===g){
P("Message ("+b+") received after "+((new Date).getTime()-c)+" ms");
try{
var h=(new Date).getTime();
//Bf:XHR_IsJavaScript(XHR),检查是否是js脚本
if(E&&a.responseText.length&&Bf(a)){
//执行该js脚本。Af()会删除js中可能的"while(1);"死循环语句
//并且返回执行该js得到的返回值
var i=Af(a.responseText);
//如果返回值是个数组
if(i instanceof Array&&i.length){
Eg(i)
}
}
P("Message ("+b+") processing took "+((new Date).getTime()-h)+" ms")
}
catch(f)
{
P("Message ("+b+") processing failed: "+f);
//xc只是调用P()
xc(f+"\n"+f.stack+"\n\n"+a.responseText);
throw f;
}
}
else if(204==g){
P("Message ("+b+") received after "+((new Date).getTime()-c)+" ms")
}
else{
P("Message ("+b+") failed with response "+g+" "+Lw(a)+" after "+((new Date).getTime()-c)+" ms.")
}
}
}
//a: url
//b: 参数列表,数组,数目为偶数,每两个数组元素都是一对的(key,value)
//c:
//d: 处理Http响应的回调函数
//AsynReqUrl(url, param, ???, callback)
function Nd(a,b,c,d)
{
var param="";
//将参数组合成 key=value&key2=value2&key3=value3...的字符串
if(b){
var f="";
for(var g=0;g<b.length;){
var h=b[g++],i=b[g++];
param += f+encodeURIComponent(h);
f="&";
if(null!==i&&undefined!==i){
param += "="+encodeURIComponent(i.toString())
}
}
}
//计数增加
var reqCount=++vt;
//创建一个XMLHttpRequest对象
var reqObj=Fm();
var nowTime=(new Date).getTime();
var callBack=function(){qp(k,j,nowTime,d)};
//计算url的分隔符是&还是?
var sep=a.indexOf("?")>=0?"&":"?";
var url=param.length?a+sep+param:a;
//用于记录的url
var tmpUrl=url;
//将url中的&都替换为& -->大概用来记录在html文件中,(作为P()的参数)
for(var r=tmpUrl.length+1;(r=tmpUrl.lastIndexOf("&",r-1))>=0;){
tmpUrl=tmpUrl.substring(0,r)+"&"+tmpUrl.substring(r+1)
}
var reqMethod;
if(c!==undefined){
//XHR_PostUrl(XHR, Url, ???, Callback)
Es(reqObj,url,c.toString(),callBack);
reqMethod="POST"
}
else{
//XHR_GetUrl(XHR, Url, Callback)
Ds(reqObj,url,callBack);
reqMethod="GET"
}
P("Message ("+reqCount+") sent: "+reqMethod+" <tt>"+tmpUrl+"</tt>.")
}
//类似与Nd,有一些区别
//分别用于哪些不同的场合呢?
//a: url
//b: 参数列表,数组,数目为偶数,每两个数组元素都是一对的(key,value)
//c: 处理Http响应的回调函数指针
function fa(a,b,c)
{
var d="";
if(b){
var e="";
for(var f=0;f<b.length;){
var g=b[f++],h=b[f++];
d+=e+encodeURIComponent(g);
e="&";
if(null!==h&&undefined!==h){
d+="="+encodeURIComponent(h.toString())
}
}
}
var i=++vt;
var j=Fm();
var k=(new Date).getTime();
var l=function(){qp(j,i,k,c)};
var n=a;
for(var o=n.length+1;(o=n.lastIndexOf("&",o-1))>=0;){
n=n.substring(0,o)+"&"+n.substring(o+1)
}
P("Message ("+i+") sent: POST <tt>"+n+"</tt>.");
Es(j,a,d,l)
}
//删除javascript中的 while(1); 死循环语句,然后执行该脚本
//a: 需要执行的javascript脚本
//EvalSafeJs(js)
function Af(a)
{
//删除while(1);
var b=a.replace(/^\s*while\s*\(\s*1\s*\)\s*;/,"");
if(b.length===a.length){
P("UNSAFE DISPATCH RECEIVED "+(a.length>100?a:a.substring(0,97)+"..."))
}
//执行js
return eval(b)
};
--
FROM 121.35.128.*