探望白血病儿童马粒之(转自阮一峰的博客)

本博主已捐一百元,希望更多的人去救救这个小孩,爱心是可以接力的。

附捐款支付宝记录:

2010-07-31_112748

探望白血病儿童马粒之

作者: 阮一峰

日期: 2010年7月28日

两周前,我收到一封求救信。

一个名叫马书柱的陌生人,请求我帮助他的儿子马粒之。他说,孩子得了白血病,需要30万元的医疗费。

于是,我就在网志上提了一句,欢迎大家向他捐款。结果,有人就说,这会不会是骗子?……我只好承诺亲自去看一看。

============================

上周末,我从厦门回到上海,立刻就与马书柱取得联系,约在今天(7月27日)下午到医院探望马粒之。

1.

吃过午饭,我来到东方路上的上海儿童医学中心。

2.

这幢大楼就是住院部。

3.

三楼的血液科病房。

4.

找到3005室。

5.

这个病房一共住6个小孩,全部都是白血病患者。马粒之的床在最里面,拉着围布的那一张。

6.

病床前的牌子写着"马粒之 4岁 自费病人",下面是用药单,记录了今天要用的药。我数了一下,一共9种。

7.

这时候,他妈妈正在给他喂饭。昨天晚上,小家伙刚刚退烧,现在精神还不错。

8.

我原以为,马粒之这次住院是因为化疗,但是一问才知道不是,化疗是在门诊完成的。

六天前,马粒之突发高烧,所以才住进医院。此后的六天,一直高烧不退,都快把他父母急死了。

9.

马书柱告诉我,由于各种药物都无法退烧,医生怀疑是真菌感染,就让他们去买一种"丽福康"注射液。每盒只有0.1g药粉,售价却高达450元,马书柱买了6盒,总计2700元。

我回家后网上一查,发现"丽福康"号称是"最先进的抗真菌药"。我就不解了,真的有必要使用这么高级的药吗?便宜的抗真菌药,市场上有很多啊!主治医生明知病人没钱,还推荐这么贵的药,但愿他/她确实有合理的理由。……好在使用了"丽福康",马粒之今天确实退烧了。

10.

马粒之还在输血。这样的一袋血,他每周要输1~2袋。他的血细胞,已经失去了正常的造血功能。

我问马书柱,这一袋血多少钱?马书柱说,血浆280元,检查费260元,所以每次输血总共要花费540元。我问,检查费是指什么项目?马书柱说,主要是查肝功能。这下我震惊了,这个医院居然每周查一次肝功能!

防止乙肝病毒输血传染,这是院方的责任,怎么能推给患者呢?马粒之只在你这里用血,你居然还要他出钱,检查你有没有把病毒传染给他,这是何等霸道的收费啊?……何况肝功能是一个比较稳定的指标,每星期查一次,根本没必要。

11.

我为马书柱全家拍了一张合影。然后,我就开始了解他们这个家庭的概况。

马书柱是河南省南阳市唐河县人,1976年11月生。高中毕业后,在南阳技校上了40天的电脑培训班。(我问,培训内容是什么?马书柱答,打字。)2000年,他去深圳打工,此后还去过广州和东莞,主要负责商场POS机的系统管理。2003年,他结婚。2005年9月,马粒之出生。

12.

2009年5月30日,马粒之出现瘀血症状。南阳县医院检查后,认为是白血病。家里不相信,到郑州复查,结论依然是白血病。

抱着对大城市医院的信任,马书柱带着儿子来到上海。6月6日抵达,6月12日就开始第一轮化疗。服用药物后,病情立刻得到缓解。2010年2月底,十轮化疗全部结束,医生对马书柱说,如果一年内不复发,马粒之的白血病就算治愈了。

不幸的是,停药后三个月,2010年5月8日,马粒之出现复发症状。他不得不再一次住进了医院,开始了第十一次化疗。医生说,复发后的化疗有效率只有30%,你们要做好思想准备。不幸中的大幸是,这一次化疗依然有效,马粒之的病情再一次缓解了。

但是此时,马书柱已经无法承受经济压力了。单单是第十一次化疗的住院费用,就超过2万元。而从2009年5月至今,为孩子治病的所有已经发生的支出,合计超过21万元。

马书柱夫妇不仅花光了所有的积蓄,还欠下了一屁股债,亲友都已经借遍了,已经到了打电话对方都不接的地步。面对未来巨额的医药费,他们一筹莫展,只有支出没有收入的生活可怎么办?

13.

马书柱每个月都去献血。上海市血液中心规定,捐献血小板的间隔不得少于28天,他就每隔28天去一次血液中心。

根据规定,献血者本人及其家属,可以等量用血。因此,马书柱这样献血,可以减少一些马粒之输血的费用。另外,献血者可以优先用血,这对马粒之也有好处。如果医院当天来了三包血浆,而有五个小孩需要用血,马粒之就不至于输不上血。

14.

献血的时候,别人都献一份,马书柱每次都献双份。那里的医生都已经认识他了,劝他不要这样,但是马书柱坚持抽满两份血才离开。

我问马书柱,你每天的伙食费是多少?他说,不超过5元,有时甚至只花2元,就在医院食堂吃几个白馒头。

15.

由于病情复发,马粒之的白血病已经不太可能通过化疗治愈了,最好情况下,化疗也只能缓解病情。只有骨髓移植,才能挽救生命。而且越早移植越好,因为化疗时间越长,对内脏器官的损伤越大,移植后产生的排斥反应也越大,移植的成功率就越小。

骨髓移植的第一步,是向中华骨髓库申请骨髓检验,检验费2800元。结果就是下面这张表。

16.

得到骨髓检验结果后,中华骨髓库初步筛选出符合条件的5位志愿者,进行高分辨血样复查,以确定是否真的符合移植条件。

每位志愿者的高分辨血样复查费是3600元,由申请骨髓移植者承担。马书柱一共付了两份复查费(也就是7200元),对两位志愿者进行了复查。结果,其中有一人确定可以为马粒之提供骨髓。

17.

上周五,马书柱又向中华骨髓库交纳了20000元的骨髓采集费,包括捐献者误工费5000元、采集前的体检费、采集后的体检费1500元、捐献者及运送造血干细胞人员的交通食宿费12500元。

18.

这就是说,骨髓移植还没有开始前,马书柱已经为此支付了前期费用2800+3600*2+20000=3万元。

据估计,骨髓移植的手术费加药物费需要30万。医院的规定是,手术前必须交齐20万元,否则不能进入隔离仓。没钱的话,即使你有配型成功的骨髓,也不给你动手术。我完全相信,这条规定会得到严格执行,因为马书柱告诉我,这次马粒之高烧住院前,他们预交了5000元住院费,结果5天就花完了。第六天,医院就对马粒之停药了,告诉他们必须再预交10000元,否则不给恢复用药。

我问马书柱,30万元骨髓移植费,你现在凑了多少?马书柱说,几乎一点都没有。我说,那怎么办?他说,实在不行,我就去求打工时的老板,愿意为他打工一辈子。

我又狠下心问,如果不进行骨髓移植,会怎么样?马书柱说,我们知道其他生这个病的小孩,最后死时很痛苦,我们实在不忍心马粒之这样。

19.

接着,我提出到马书柱租的房子去看看。那是一个老式住宅区,距离医院步行15分钟。

20.

他们租的屋子在5楼,楼道非常破旧。

21.

房子就是简单的一室户。外间是很简陋的煤卫,里间是一间15平米左右的卧室。没有家具,马书柱说,桌椅都是好心的邻居给的,还给了一辆破自行车,现在就是他们全家主要的交通工具。

这间屋子的租金是1700元/月。

22.

有一个14寸的彩色电视机,马书柱说,那是献血时认识的好心人给的。

23.

屋里还有一个有线电视Modem。马书柱说,那是400元的二手货,其中包括3个月的宽带上网费。

24.

告别马书柱,我回到大街上,心里不由泛起无限感慨。我从没料到,居然有一天,我会为一个陌生人,感到如此烦恼。

救助像马粒之这样的重病儿童,是政治家的责任,不是我的责任。我只是一个普通人,收入不高,没有能力当慈善家。新闻报道里说,全国每年白血病儿童新增1.6~2万人,可是只有1200~1500人得到正规诊治。就算我能帮得了一个两个,可是剩下的还有千千万万个,以后要是不断有人写信向我求助,我该怎么办?

一直以来,我都很低调,躲在图书馆里,不想直接面对这个社会最苦难的那些人和事,可是这样的事情偏偏找上门。时代不放过你,逼着你表态,你到底有一颗怎样的良心。政治家可以不负责任,可以不要良心,但是我做不到,无法扭过头去,如果我再装作没有看见,也许马粒之真的就活不下去了。看着他就在我面前,机灵地爬来爬去,真的是于心何忍。

25.

马粒之小朋友,叔叔没本事,不知道怎样才能救你。

30万元的手术费,在这个城市里,连一间没人要住的亭子间都买不到。可是,你很可能就会因为搞不到这点钱,而痛苦地死去。

也许有些人会对你说,很不幸,这就是你的命运,谁叫你生在中国,谁叫你这么穷。是的,也许我也会狠着心这么说,痛苦地承认这是实话。但是,不,不是现在。现在,让我们暂时忘记这些话,假装说服自己会有奇迹发生。

迄今为止第一次,我希望我的网志能有更大的影响力,希望有更多的人,能够读到这篇文章。如果你读到了,希望你能做点什么,哪怕只是转贴一下。

============================

马书柱的手机13671623478,他现租住于上海市浦东新区南泉路1111弄峨山小区20号503室。愿意上门看望的朋友,欢迎与他联系。

捐款帐户:

* 户名:马粒之
开户行:中国建设银行股分有限公司上海六里支行
账号:1214 8799 8011 1070 196

* 户名:马粒之
开户行:中国工商银行上海南泉路支行
账号:622202 1001068165205

* 户名:马粒之
开户行:中国邮政储蓄银行上海市临沂储蓄所
账号:6029 2325 0213 4793 84

* 户名:马粒之
开户行:农行上海浦建路储蓄所
账号:622848 0031037264012

* 户名:马粒之
开户行:上海银行蓝村支行
账号:300845620210015

* 支付宝账户: 68280388@QQ.COM (实名:马书柱)

* 财付通账户:68280388@QQ.COM (实名:马书柱)

其他情况参见网站:http://www.malizhi.com

(完)

发表在 叽叽歪歪 | 标签为 , | 2 条评论

创建一个自定义样式的select(2)

创建一个自定义样式的select(1)中我们成功的为select隐去其原来的样式,创造了伪装起来的外观,并且看上去还过得去,现在我们将真正为些自定义select绑定行为。

首先,我们需要一个构造函数,以生成伪装的select样式。

我们将其命名为BB.select,然后我们需要四个方法:

init()        负责生成基本的HTML结构,绑定事件,初始化整个select的行为。
click()      模拟点击select元素时弹出列表的行为
liClick()    模拟option上的点击事件,并返回值到真正的select元素内
hideList() options列表弹出时,用户在除options以外的地方点击鼠标时,则options列表要收回
在最底部我们还在document对像上绑定了click和scroll事件,用于检测并激活hideList()的行为。

基本结构如下:

var BB = {};
BB.select = function(oObj){
	this.oObj = oObj;               //select
	this.width = oObj.offsetWidth;  //select宽度
	this.tObjText;                  //select中显示的文字
	this.relUL;                     //与select相关联的ulList列表id
	var that = this;
	if (typeof BB.select._initialized == 'undefined') {

		BB.select.prototype.init = function(){
			//初始化模拟出来的ul列表,绑定click事件
		};

		BB.select.prototype.click = function(){
			//模拟select的点击事件
		};

		BB.select.prototype.liClick = function(){
			//列表项的点击事件,返回值到select中
		};

		BB.select.prototype.hideList = function(e){
			//在列表外位置点击或者滚动页面时,隐藏列表
		};

		(function(){
			//在document对像上绑定mousedown和scroll事件,以实现点击其它区域时select消失,只需绑定一次
			BB.EVENT.addEvent('mousedown', that.hideList);
			BB.EVENT.addEvent('scroll', that.hideList);
		})();

		BB.select._initialized = 1;
	}
	this.init();
}

先是init()函数:

为了生成下图的这种结构:

image

我们并不需要在每个select外面手工的写入,我们只需要在init()函数里加入如下代码:

var nSelectIndex = 0;
for (var i = this.oObj.options.length - 1; i >= 0; i--) {
	if (this.oObj.options[i].selected) {
		nSelectIndex = i;
	}
}
this.tObjText = this.oObj.options[nSelectIndex].innerHTML;
//对应处于选中状态的option里的文字内容

//外层套入两个span模拟select的外观效果
var selectIn, selectOut, textNode;
selectIn = document.createElement('span');
selectOut = document.createElement('span');
textNode = document.createElement('span');
selectOut.className = 'selectOut';
selectIn.className = 'selectIn';
selectIn.style.width = this.width - 25 + 'px';
//根据select框的宽度对应生成
selectIn.style.padding = '0 24px 0 6px';
textNode.innerHTML = this.tObjText;
selectIn.appendChild(textNode);
selectOut.appendChild(selectIn);
this.oObj.parentNode.insertBefore(selectOut, this.oObj);
selectIn.appendChild(this.oObj);
this.oObj.className = 'noShow';

接下来,我们将根据select对应的options对像的内容生成一ul>li列表来模拟options

//生成一个名为oObj.id + 'List'的ul列表
var oDiv = document.createElement('div');
oDiv.id = 'ulListFor' + this.oObj.id;
oDiv.className = 'selectUlList';
oDiv.style.width = this.width - 5 + 'px';
oDiv.style.height = '130px';

var oUl = document.createElement('ul');
var nOptionLength = oObj.options.length;
for (var i = 0; i < nOptionLength; i++) {
	var oLi = document.createElement('li');
	oLi.setAttribute("onmouseover", "this.className = 'active'");
	oLi.setAttribute("onmouseout", "this.className = ''");
	//oLi.setAttribute('value', oObj.options[i].value);
	oLi.appendChild(document.createTextNode(this.oObj.options[i].innerHTML));
	oUl.appendChild(oLi);
	BTO.EVENT.addEvent('click', this.liClick(), oLi);
}
oDiv.appendChild(oUl);

我们再将此ul列表写入到对应select的位置,并在selectOut元素上绑定click()事件

//追加此ulList到页面中
selectOut.parentNode.appendChild(oDiv);
this.relUL = oDiv; //与select相关联的ulList列表id
//为其绑定onclick事件
BTO.EVENT.addEvent('click', this.click(), selectOut);

//在document对像上绑定mousedown和scroll事件,以实现点击其它区域时select消失
if (!this.onceEvent) {
	BTO.EVENT.addEvent('mousedown', that.hideList);
	BTO.EVENT.addEvent('scroll', that.hideList);
}

而click事件则非常简单:

  1. 根据当前点击的selectOut算出坐标
  2. 把对应的ul列表显示在对应的位置
BB.select.prototype.click = function(){
	//模拟select的点击事件
	var that = this;
	return function(){
		if (that.relUL.style.display == '') {
			var absOffset = getAbsPos(that.oObj);
			//到到绝对坐标
			that.relUL.style.top = absOffset.y + 'px';
			that.relUL.style.left = absOffset.x - 5 + 'px';
			that.relUL.style.zIndex = '99';
			that.relUL.style.display = 'block';
		} else {
			that.relUL.style.display = '';
		}
	}
};

而在li的点击事件,则需要如下做:

  1. 遍历与ul列表对应的select.options对像
  2. 找到与之相等的option
  3. 将此option标记为已选中
  4. 将其它option的已选中状态去掉(因option可以存在多选)
  5. 更新显示的文字
  6. 隐藏ul列表
BB.select.prototype.liClick = function(){
    //列表项的点击事件,返回值到select中
    var that = this;
    return function(e){
        var e = e || window.event;
        var obj = e.srcElement || e.target;

        var oOption = that.oObj.options;
        for (var i = oOption.length - 1; i >= 0; i--) {
            if (obj.innerHTML == oOption[i].innerHTML) {
                //设置选中项
                oOption[i].setAttribute('selected', 1);
                //设置selectIn中的文字内容
                obj.innerHTML = that.oObj.parentNode.getElementsByTagName('span')[0].innerHTML = oOption[i].innerHTML;
                that.relUL.style.display = '';
            } else {
                oOption[i].removeAttribute('selected');
            }
        }
    }
};

最后的事件是hideList,它的逻辑也很简单:

  1. 检测document对像内的所有click和scroll事件
  2. 查找其所有父级对像
  3. 如果所有父级对像的class均不为selectUlList(说明是在事件ul列表外部产生)
  4. 隐藏所有class为selectUlList的列表
BB.select.prototype.hideList = function(e){
    //在列表外位置点击或者滚动页面时,隐藏列表
    var e = e || window.event;
    var obj = e.srcElement || e.target;

    var clickInner = 0; //是否点击在内部
    if (obj.parentNode) {
        while (obj.parentNode) {
            if (obj.className == 'selectUlList') {
                clickInner = 1;
                break;
            }
            obj = obj.parentNode;
        }
    }
    if (!clickInner) {
        if (document.getElementsByClassName) {
            //DOM5 方法(ff/other)
            var aDiv = document.getElementsByClassName('selectUlList');
            for (var i = aDiv.length - 1; i >= 0; i--) {
                aDiv[i].style.display = '';
            }
        } else {
            //ie
            var aDiv = document.getElementsByTagName('div');
            for (var i = aDiv.length - 1; i >= 0; i--) {
                if (aDiv[i].id.indexOf('ulListFor') != -1) {
                    aDiv[i].style.display = '';
                }
            }
        }
    }
};

代码已经基本完成,我们来看一下所有的代码是什么样子。

HTML部分:

BB.select = function(oObj){
    this.oObj = oObj; 					//select
    this.width = oObj.offsetWidth; 		//select宽度
    this.tObjText; 						//select中显示的文字
    this.relUL; 						//与select相关联的ulList列表id
    var that = this;
    if (typeof BB.select._initialized == 'undefined') {

        BB.select.prototype.init = function(){
            var nSelectIndex = 0;
            for (var i = this.oObj.options.length - 1; i >= 0; i--) {
                if (this.oObj.options[i].selected) {
                    nSelectIndex = i;
                }
            }
            this.tObjText = this.oObj.options[nSelectIndex].innerHTML;

            //外层套入两个span模拟select的外观效果
            var selectIn, selectOut, textNode;
            selectIn = document.createElement('span');
            selectOut = document.createElement('span');
            textNode = document.createElement('span');
            selectOut.className = 'selectOut';
            selectIn.className = 'selectIn';
            selectIn.style.width = this.width - 25 + 'px';
            selectIn.style.padding = '0 24px 0 6px';
            textNode.innerHTML = this.tObjText;
            selectIn.appendChild(textNode);
            selectOut.appendChild(selectIn);
            this.oObj.parentNode.insertBefore(selectOut, this.oObj);
            selectIn.appendChild(this.oObj);
            this.oObj.className = 'noShow';
            //oObj.replaceNode(selectIn.appendChild(oObj));
            //生成一个名为oObj.id + 'List'的ul列表
            var oDiv = document.createElement('div');
            oDiv.id = 'ulListFor' + this.oObj.id;
            oDiv.className = 'selectUlList';
            oDiv.style.width = this.width - 5 + 'px';
            oDiv.style.height = '130px';

            var oUl = document.createElement('ul');
            var nOptionLength = oObj.options.length;
            for (var i = 0; i < nOptionLength; i++) {
                var oLi = document.createElement('li');
                oLi.setAttribute("onmouseover", "this.className = 'active'");
                oLi.setAttribute("onmouseout", "this.className = ''");
                //oLi.setAttribute('value', oObj.options[i].value);
                oLi.appendChild(document.createTextNode(this.oObj.options[i].innerHTML));
                oUl.appendChild(oLi);
                BTO.EVENT.addEvent('click', this.liClick(), oLi);
            }
            oDiv.appendChild(oUl);

            //追加此ulList到页面中
            selectOut.parentNode.appendChild(oDiv);
            this.relUL = oDiv; //与select相关联的ulList列表id
            //为其绑定onclick事件
            BTO.EVENT.addEvent('click', this.click(), selectOut);

            //在document对像上绑定mousedown和scroll事件,以实现点击其它区域时select消失
            if (!this.onceEvent) {
                BTO.EVENT.addEvent('mousedown', that.hideList);
                BTO.EVENT.addEvent('scroll', that.hideList);
            }
        };

        BB.select.prototype.click = function(){
            //模拟select的点击事件
            var that = this;
            return function(){
                if (that.relUL.style.display == '') {
                    var absOffset = getAbsPos(that.oObj);
                    that.relUL.style.top = absOffset.y + 'px';
                    that.relUL.style.left = absOffset.x - 5 + 'px';
                    that.relUL.style.zIndex = '99';
                    that.relUL.style.display = 'block';
                } else {
                    that.relUL.style.display = '';
                }
            }
        };

        BB.select.prototype.liClick = function(){
            //列表项的点击事件,返回值到select中
            var that = this;
            return function(e){
                var e = e || window.event;
                var obj = e.srcElement || e.target;

                var oOption = that.oObj.options;
                for (var i = oOption.length - 1; i >= 0; i--) {
                    if (obj.innerHTML == oOption[i].innerHTML) {
                        //设置选中项
                        oOption[i].setAttribute('selected', 1);
                        //设置selectIn中的文字内容
                        obj.innerHTML = that.oObj.parentNode.getElementsByTagName('span')[0].innerHTML = oOption[i].innerHTML;
                        that.relUL.style.display = '';
                    } else {
                        oOption[i].removeAttribute('selected');
                    }
                }
            }
        };

        BB.select.prototype.hideList = function(e){
            //在列表外位置点击或者滚动页面时,隐藏列表
            var e = e || window.event;
            var obj = e.srcElement || e.target;

            var clickInner = 0; //是否点击在内部
            if (obj.parentNode) {
                while (obj.parentNode) {
                    if (obj.className == 'selectUlList') {
                        clickInner = 1;
                        break;
                    }
                    obj = obj.parentNode;
                }
            }
            if (!clickInner) {
                if (document.getElementsByClassName) {
                    //DOM5 方法(ff/other)
                    var aDiv = document.getElementsByClassName('selectUlList');
                    for (var i = aDiv.length - 1; i >= 0; i--) {
                        aDiv[i].style.display = '';
                    }
                } else {
                    //ie
                    var aDiv = document.getElementsByTagName('div');
                    for (var i = aDiv.length - 1; i >= 0; i--) {
                        if (aDiv[i].id.indexOf('ulListFor') != -1) {
                            aDiv[i].style.display = '';
                        }
                    }
                }
            }
        };

        (function(){
            //在document对像上绑定mousedown和scroll事件,以实现点击其它区域时select消失,只需绑定一次
            BTO.EVENT.addEvent('mousedown', that.hideList);
            BTO.EVENT.addEvent('scroll', that.hideList);
        })();

        BB.select._initialized = 1;
    }
    this.init();
}

我们只需这样调用:

new BB.select($('selectId'));

这就可以生成一个有着漂亮外观的select样式列表了。

您可以在这儿下载或预览效果

思考:虽然我们的效果达到了,但是我们注意到hideList()、click()、liClick()方法都暴露在外,有没有办法将其变成私有方法呢?提示是:闭包!

发表在 学习笔记 | 标签为 , , | 留下评论

创建一个自定义样式的select(1)

在某些时候,我们需要为一些网站或应用创建一些外观风络一致组件,如select元素

首先我们构建css部分,思路是在select外层套入两个span构成滑动门结构,然后隐藏掉select元素(不能直接display:none,否则两个span元素不能被撑大,你只能得到一个小小的圆框框),以下为css结构

.selectOut{
	cursor:pointer;
	display:inline-block !important;
	_display:inline !important;
	zoom:1;
	height:24px;
	margin-left:3px;
	background:url(images/elem/selRight.gif) right 0 no-repeat}
.selectOut .selectIn{
	height:24px;
	position:relative;
	*position:inherit;
	_position:static;
	_width:0;
	overflow:visible;
	margin-left:-2px;
	display:inline-block;
	background:url(images/elem/selLeft.gif) 0 0 no-repeat;
	line-height:22px;
	color:#111111;
	text-align:left;}
	.selectOut .selectIn select{
		display:inline-block;
		_display:inline;
		height:24px;
        font-family:Arial;
        padding-right:10px;
		visibility:hidden;
		font-family:Arial;}
	.selectOut .selectIn select.noShow{
		display:none;
	}

.selectUlList{
	display:none;
	position:absolute;
	border:1px solid #6cc;
	overflow-x:hidde;
	overflow-y:scroll;
	background-color:#F7F7F7;
	color:#87946A;
	height:140px;
	padding:2px;
}
.selectUlList ul{
	text-align:left;
	list-style:none;
	padding:0;
	margin:0;}
	.selectUlList ul li{
		padding-left:2px;
		cursor:pointer;
		height:20px;
		line-height:20px;
	}
	.selectUlList ul li.active{
		background-color:#CEF2F2;
		color:#033;}

现在select元素的HTML结构如下:

image

外层的selectOut构成了右边的圆角框,内层的selectIn构成了左边的圆角框,框的大小会随着select自身的长度带动缩放,外观上接近完美啦。

image

附两个背景图片下载(直接点击下面两个图片)

selLeft selRight

注意,此时select中的字符内容还没显示出来,我们将在第二节中为其完其需要的js,并使其能正常运作。

发表在 学习笔记 | 标签为 | 一条评论

自己写的AJAX封装

只贴出了get部分的代码,post的部分请试着自己完成

var BB = {};
BB.AJAX = function(){
    var oAJAX = {};
    if (typeof XMLHttpRequest == 'undefined' && window.ActiveXObject) {
        var aSignatures = ['MSXML2.XMLHTTP.5.0', 'MSXML2.XMLHTTP.4.0', 'MSXML2.XMLHTTP.3.0', 'MSXML2.XMLHTTP','Microsoft.XMLHTTP'];
        var nSignaturesLength = arrSignatures.length;
        for (var i = 0; i < nSignaturesLength; i++) {
            try {
                oAJAX = new ActiveXObject(aSignatures[i]);
            }
            catch (oError) {
                //ignore
            }
        }
    } else if (XMLHttpRequest) {
        oAJAX = new XMLHttpRequest();
    } else {
        //ajax on this system is not support
    }
    if (typeof oAJAX._initialized == 'undefined') {
        oAJAX.get = function(getArguments){
            if (getArguments.data) {
                //对要传送的数据附加到url上
                getArguments.url += url.indexOf('?') == -1 ? '?' : '&';
                for (var i in getArguments.data) {
                    url += encodeURIComponent(i) + '=' + encodeURIComponent(getArguments.data[i]) + '&';
                }
                getArguments.url.length--;
            }
            this.open('get', getArguments.url, getArguments.sync || 0);
            if (getArguments.callback) {
                //绑定回调事件
                this.onreadystatechange = function(){
                    if (this.readyState == 4) {
                        getArguments.callback();
                    }
                }
            }
            this.send(null);
        };
        oAJAX.post = function(url, data, callback){

        };
        oAJAX._initialized = 1;
    }
    return oAJAX;
}();

调用方式如下:

BB.AJAX.get({
    url: 'templates/' + oTemplates['action'] + '.js',
       sync: 1,
       callback: function(){
           //console.log('templates is load');
       }
});

PS:最近试着写点OOP的JS……嗯,其实JS也是可以很优雅的

发表在 学习笔记 | 标签为 , , | 留下评论

简单的DOM事件处理函数

var BB = {};  /*为什么用BB?因为本站名为BlueBala!*/
BB.EVENT = {
  supportDOM : document.addEventListener ? 1 : (document.attachEvent ? 0 : -1),
  //supportDOM:
  	//1: ff/webkit/opera...(标准2级DOM支持)
	//0:ie 5.5+
	//-1:不支持高级DOM事件模型
  addEvent : (function(eEvent,fFun,oObj){
  //增加事件
    if (!oObj){
      oObj = document;
    }
    if (BB.EVENT.supportDOM == 1) {
      oObj.addEventListener(eEvent, fFun, true);
    }else if(BB.EVENT.supportDOM == 0){
      oObj.attachEvent('on' + eEvent, fFun);
    }else if(BB.EVENT.supportDOM == -1){
      return false;
      alert ("不支持2级DOM模型");
    }
  }),
  removeEvent : (function(eEvent,fFun,oObj){
  //移除事件
    if (!oObj){
      oObj = document;
    }
    if (BB.EVENT.supportDOM == 1) {
      oObj.removeEventListener(eEvent, fFun, true);
    }else if(BB.EVENT.supportDOM == 0){
      oObj.detachEvent('on' + eEvent, fFun);
    }else if(BB.EVENT.supportDOM == -1){
      return false;
      alert ("不支持2级DOM模型");
    }
  })
};

一个很简单的2级DOM事件处理器,用法如下:

BB.EVENT.addEvent('keyup',function(){
  this.value = this.value.replace(/\D/,'');
},document.getElementById('age'));

需要注意的是:

  1. 在上面代码中的this,指向的是匿名函数的运行时的this,而非BB对象。
  2. keyup前面不要加’on’
  3. 如果省略第三个参数“document.getElementById(‘age’)” ,则事件将添加到document对像上
  4. 如果你需要对IE 5.5或更低的浏览器保持兼容,那你需要对BB.EVENT.supportDOM == -1的情况做进一步处理:先将老事件保存,添加你的新事件,在你的新事件运行完后,再处理老事件……老实说,在IE 6都不足10%的环境下,真无必要!
发表在 学习笔记 | 标签为 , | 留下评论