编写高质量代码(7)

Javascript分层概念
分为3层
base层,最底层,有两个功能一个是用来兼容浏览器,第二是扩展js接口,提供一些更方便的接口
common层 依赖于base层接口,提供可复用的组件,是典型MVC模式里的 M 和页面内的具体功能没什么关系,功能是给page层提供组件
page层,三层最顶层,和页面的具体功能直接相关,是MVC里的C 依赖于前两个层,page层的功能是完成页面功能需求
下面主要是说base层的问题
封装一些基本函数
首先是childNodes问题,在火狐下,空格会被计入到子节点数,所以在使用nextS就会出现问题,如何兼容呢?

function getNextNode(node){
        node=(typeof node)=="string"?document.getElementById(node):node;
        var nextNode=node.nextSibling;
        if(!nextNode) return null;
        if(!document.all){
            while(true){
                if(nextNode.nodeType==1){
                    break
                }else{
                    if(nextNode.nextSibling){
                        nextNode=nextNode.nextSibling;
                    }else{
                        break;
                    }
                }
            }
        }
        return nextNode
    }

event对象兼容

function getElementTarget(e){
    e=window.event||e;
    return e.srcElement||e.target
}

阻止冒泡,前面的文章有介绍过

function stopPropagation(e){
    e=window.event||e;
    if(document.all){
        e.cancelBubble=true;
    }else{
        e.stopPropagation();
    }
}

事件绑定,ie下attachEvent 和标准的addEventListener

function on(node,eventType,fun){
    node=typeof node=="string"?document.getElementById(node):node;
    if(document.all){
        node.attachEvent("on"+eventType,fun);
    }else{
        node.addEventListener(eventType,fun,false)
    }
}

表格验证中,是否为空,有空格或者缩进就饶过

function trim(ostr){
    return ostr.replace(/^\s+|\s+$/g,"");
}

简单的getId封装

function get(node){
    node=typeof node=="string"?document.getElementById(node):node;
    return node
}

为了方便getClass函数,这个比我以前的更完整,可以判断多个class在一起的情况

function getClass(str,root,tag){
    if(root){
        root=typeof root=="string"?document.getElementById(root):root;
    }else{
        root=document.body;
    }
    tag=tag||"*";
    var els=root.getElementsByTagName(tag);
    var arr=[];
    for(var i=0,n=els.length;i<n;i++){
    //下面这一行就可以判断多个class中是否含有选定class,因为我们的节点不一定有几个class
        for(var j=0,k=els[i].className.split(" "),l=k.length;j<l;j++){
            if(k[j]==str){
                arr.push(els[i]);
                break;
            }
        }
    }
    return arr;
}
//---------定义类型判断函数--------
function isNumber(s){
    return !isNaN(s);
}
function isString(s){
    return typeof s==="string";
}
function isBoolean(s){
    return typeof s==="boolean";
}
function isFucntion(s){
    return typeof s==="function";
}
function isNull(s){
    return typeof s==="null";
}
function isUndefined(s){
    return typeof s==="undefined";
}
function isEmpty(s){
    return /^\s+$/.test(s);
}
function isArray(s){
    return s instanceof Array;
}

最后这一个,怎么说呢能力有限,我的解释也不是非常对,希望有人可以解释一下吧,这个也就是个人的理解

//---------继承--------
function extend(subClass,superClass){
    var F=function(){};
    F.prototype=superClass.prototype;//父级原型实例化成F的原型
    subClass.prototype=new F();//实例化子级原型
    subClass.prototype.constructor=subClass;//让construcetor指向子级
    subClass.superclass=superClass.prototype;//属性指向父级原型,这里为什么这么写有些疑问
    if(superClass.prototype.constructor==Object.prototype.constructor){//如果父函数也是继承别人的那么指正
        superClass.prototype.constructor=superClass;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小疯疯0413

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值