前几天公司要写一个calendar 的程序,因为要求ajax提交的时候,这个js的大小要很小(不能超过3K),而且要处理ajax的并发性问题,这样我就必须要写一个自己的ajax程序。刚好这个任务下来是周五,我就利用周末的时间写了一个简单的javascrpit的框架,包括以下的内容:
1. 内核,处理类,类的继承,一些简单的常用的函数。
2. Ajax处理,处理了并发提交时候的互相替换问题。
3. Event处理,简单的事件监听函数。
4. Calendar 一个简单的日历,允许在日历上添加事件。
5. Json 数据的json的处理。
等我有空,我会整理一个文档出来。现在我只是把源代码发布出来,有任何建议,请给我来信niwzw@163.com
NanJia 是我公司的名字,在这里仅仅是做为命名空间,以防止和其他的类库冲突。
ajax部分我给它提取成了一个独立的文件,下面的它的代码,它的核心是用了一个对象池技术。
NanJia = {};
NanJia.ObjPool = function()
{
this.Pool = [];
this.Args = [];
}
NanJia$ObjPool = NanJia.ObjPool.prototype;
NanJia$ObjPool.GetInstance = function (createH, compareH, args)
{
for (var i = 0; i < this.Pool.length; i++)
{
if (this.Compare(this.Pool[i], compareH))
{
this.Args[i] = args;
return this.Pool[i];
}
}
var argu = Array.prototype.slice.call(arguments, 3);
this.Pool[this.Pool.length] = createH.apply(this, argu);
this.Args[this.Pool.length-1] = args;
return this.Pool[this.Pool.length - 1];
}
NanJia$ObjPool.Compare = function(obj, handle)
{
return handle.call(this, obj);
}
NanJia$ObjPool.GetInfo = function(obj)
{
for (var i = 0; i < this.Pool.length; i++)
{
if (this.Pool[i] === obj)
{
break;
}
}
if (i == this.Pool.length)
{
return [];
}
else
{
return this.Args[i];
}
}
NanJia.XMLHttp = function(){
this.Response = null;
}
NanJia.XMLHttp.ObjPool = new NanJia.ObjPool();
NanJia$XMLHttp = NanJia.XMLHttp.prototype;
NanJia.XMLHttp.Create = function()
{
if (window.ActiveXObject)
{
var MSXML = ['MSXML2.XMLHTTP.6.0', 'MSXML2.XMLHTTP.5.0', 'MSXML2.XMLHTTP.4.0', 'MSXML2.XMLHTTP.3.0', 'MSXML2.XMLHTTP', 'Microsoft.XMLHTTP'];
var e;
for(var n = 0; n < MSXML.length; n ++)
{
try {
var objXMLHttp = new ActiveXObject(MSXML[n]);
break;
}
catch(e)
{
//NanJia.Alert(e);
}
}
} else {
var objXMLHttp = new XMLHttpRequest();
}
return objXMLHttp;
}
NanJia$XMLHttp.Request = function (url, data, method, callBack)
{
var argu = Array.prototype.slice.call(arguments, 4);
var objXMLHttp = NanJia.XMLHttp.ObjPool.GetInstance(NanJia.XMLHttp.Create, NanJia.XMLHttp.Compare, argu);
var e;
try {
if (url.indexOf("?") > 0){
url += "&randnum=" + Math.random();
} else {
url += "?randnum=" + Math.random();
}
objXMLHttp.onreadystatechange = function () {
callBack.call(this, objXMLHttp);
}
objXMLHttp.open(method, url, true);
objXMLHttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded;charset=UTF-8');
objXMLHttp.send(data);
} catch(e) {
NanJia.Alert(e);
}
}
NanJia.XMLHttp.Compare = function(objXMLHttp)
{
return (objXMLHttp.readyState == 4) || (objXMLHttp.readyState == 0);
}
NanJia$XMLHttp.Update = function(url, id, method, param)
{
if (method == null || method == 'undefind')
{
method = "post";
}
this.Request(url, param, method, this.DivUpdate, id);
}
NanJia$XMLHttp.DivUpdate = function (obj, id)
{
if (objXMLHttp.readyState == 4)
{
NanJia.$(id).innerHTML = this.EvalScripts(obj.responseText);
}
}
NanJia.$ = function(id)
{
return document.getElementById(id);
}
NanJia.$S = function(id)
{
return NanJia.$(id).options[NanJia.$(id).selectedIndex].value;
}
NanJia.EvalScripts = function(str)
{
var ScriptFragment = '<script[^>]*>([\\S\\s]*?)<\/script>';
var matchAll = new RegExp(ScriptFragment, 'img');
var matchOne = new RegExp(ScriptFragment, 'im');
var str1 = str.match(matchAll);
var re = "", i, v;
if (str1 == null) {
return (str);
}
for (i = 0; i < str1.length; i++) {
v = str1[i];
re += v.match(matchOne)[1]+"\n";
}
eval(re);
return str.replace(matchAll, '');
}
NanJia$XMLHttp.toParam = function(arr) {
str = "";
for (key in arr)
{
if (typeof arr[key] == "string" || typeof arr[key] == "number")
{
str += "&"+key+"="+arr[key];
}
}
str = str.replace(/^&/, '');
return str;
}
$String = String.prototype;
$String.trim = function() {
return this.replace(/^\s+|\s+$/g, '');
}
NanJia.ObjPool = function()
{
this.Pool = [];
this.Args = [];
}
NanJia$ObjPool = NanJia.ObjPool.prototype;
NanJia$ObjPool.GetInstance = function (createH, compareH, args)
{
for (var i = 0; i < this.Pool.length; i++)
{
if (this.Compare(this.Pool[i], compareH))
{
this.Args[i] = args;
return this.Pool[i];
}
}
var argu = Array.prototype.slice.call(arguments, 3);
this.Pool[this.Pool.length] = createH.apply(this, argu);
this.Args[this.Pool.length-1] = args;
return this.Pool[this.Pool.length - 1];
}
NanJia$ObjPool.Compare = function(obj, handle)
{
return handle.call(this, obj);
}
NanJia$ObjPool.GetInfo = function(obj)
{
for (var i = 0; i < this.Pool.length; i++)
{
if (this.Pool[i] === obj)
{
break;
}
}
if (i == this.Pool.length)
{
return [];
}
else
{
return this.Args[i];
}
}
NanJia.XMLHttp = function(){
this.Response = null;
}
NanJia.XMLHttp.ObjPool = new NanJia.ObjPool();
NanJia$XMLHttp = NanJia.XMLHttp.prototype;
NanJia.XMLHttp.Create = function()
{
if (window.ActiveXObject)
{
var MSXML = ['MSXML2.XMLHTTP.6.0', 'MSXML2.XMLHTTP.5.0', 'MSXML2.XMLHTTP.4.0', 'MSXML2.XMLHTTP.3.0', 'MSXML2.XMLHTTP', 'Microsoft.XMLHTTP'];
var e;
for(var n = 0; n < MSXML.length; n ++)
{
try {
var objXMLHttp = new ActiveXObject(MSXML[n]);
break;
}
catch(e)
{
//NanJia.Alert(e);
}
}
} else {
var objXMLHttp = new XMLHttpRequest();
}
return objXMLHttp;
}
NanJia$XMLHttp.Request = function (url, data, method, callBack)
{
var argu = Array.prototype.slice.call(arguments, 4);
var objXMLHttp = NanJia.XMLHttp.ObjPool.GetInstance(NanJia.XMLHttp.Create, NanJia.XMLHttp.Compare, argu);
var e;
try {
if (url.indexOf("?") > 0){
url += "&randnum=" + Math.random();
} else {
url += "?randnum=" + Math.random();
}
objXMLHttp.onreadystatechange = function () {
callBack.call(this, objXMLHttp);
}
objXMLHttp.open(method, url, true);
objXMLHttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded;charset=UTF-8');
objXMLHttp.send(data);
} catch(e) {
NanJia.Alert(e);
}
}
NanJia.XMLHttp.Compare = function(objXMLHttp)
{
return (objXMLHttp.readyState == 4) || (objXMLHttp.readyState == 0);
}
NanJia$XMLHttp.Update = function(url, id, method, param)
{
if (method == null || method == 'undefind')
{
method = "post";
}
this.Request(url, param, method, this.DivUpdate, id);
}
NanJia$XMLHttp.DivUpdate = function (obj, id)
{
if (objXMLHttp.readyState == 4)
{
NanJia.$(id).innerHTML = this.EvalScripts(obj.responseText);
}
}
NanJia.$ = function(id)
{
return document.getElementById(id);
}
NanJia.$S = function(id)
{
return NanJia.$(id).options[NanJia.$(id).selectedIndex].value;
}
NanJia.EvalScripts = function(str)
{
var ScriptFragment = '<script[^>]*>([\\S\\s]*?)<\/script>';
var matchAll = new RegExp(ScriptFragment, 'img');
var matchOne = new RegExp(ScriptFragment, 'im');
var str1 = str.match(matchAll);
var re = "", i, v;
if (str1 == null) {
return (str);
}
for (i = 0; i < str1.length; i++) {
v = str1[i];
re += v.match(matchOne)[1]+"\n";
}
eval(re);
return str.replace(matchAll, '');
}
NanJia$XMLHttp.toParam = function(arr) {
str = "";
for (key in arr)
{
if (typeof arr[key] == "string" || typeof arr[key] == "number")
{
str += "&"+key+"="+arr[key];
}
}
str = str.replace(/^&/, '');
return str;
}
$String = String.prototype;
$String.trim = function() {
return this.replace(/^\s+|\s+$/g, '');
}