早前写的JS选择Class 的函数,不足之处,请高手见谅!
我比较喜欢纯JS,当然Jquery来的更方便一点!
function GetClass(ClassName){
     /* kangyangyang 2010-01-12
     * 为空获取全部集合
     * first 获得集合第一个元素 --异常抛出错误 -- 单个对象
     * last 获取集合最后一个元素 --异常抛出错误 -- 单个对象
     * eq(1) 获取第二个元素。 下标从0算起 --异常返回全部对象集合 -- 数组对象
     * fed(2) 获取前三个 下标从0算起  --异常返回全部对象集合 -- 数组对象
     * led(2) 获取后两个 下标从0算起   --异常返回全部对象集合 -- 数组对象
     * sub(2,2)获取第二个到第四个  --异常返回全部对象集合 -- 数组对象
     */
    var element = new Array(); //对象集合
    var way = new Array(); //记录获取方式
    var maths = new Array(); //记录获取个数
    var mar = false; //false or true  标识作用
    var classel; //存储用户输入的Class
    if(ClassName){
        var Reg = new RegExp(/:{1}/);
        if(Reg.test(ClassName)){
            way = ClassName.split(":");
            way[1]?mar=true:mar=false;
            mar?classel=way[0]:classel=ClassName;
            way[1] = way[1].toLowerCase();
            if((way[1].search(/fed{1}/) != -1) || (way[1].search(/led{1}/) != -1) || (way[1].search(/eq{1}/) != -1)){
                maths[0] = Number(way[1].match(/\d{1}/)) + 1;
            }else if(way[1].search(/sub{1}/) != -1){
                maths[0] = Number(way[1].match(/\d+/g).toString().split(",")[0]) + 1;
                maths[1] = Number(way[1].match(/\d+/g).toString().split(",")[1]) + 1;
            }
        }else{
            classel = ClassName;
        }
    }
    var elements = document.getElementsByTagName("*");
    for(var i = 0; i < elements.length; i++){
        if(elements[i].className == classel){
            element[element.length] = elements[i];    
        }
    }
    if(!mar){
        return element;
    }else{
        if((maths[0] >= 1 && maths[0] <= element.length) || ((way[1].search(/first{1}/) != -1) || (way[1].search(/last{1}/) != -1))){
            if(way[1].search(/first{1}/) != -1){
                return element[0];
            }else if(way[1].search(/last{1}/) != -1){
                return element[element.length - 1];
            }else if(way[1].search(/fed{1}/) != -1){
                var ele = new Array(); //暂存对象
                for(var j = 0;j < maths[0];j++){
                    ele[ele.length] = element[j];    
                }
                return ele;
            }else if(way[1].search(/led{1}/) != -1){
                var ele = new Array(); //暂存对象
                element = element.reverse();
                for(var j = 0;j < maths[0];j++){
                    ele[ele.length] = element[j];    
                }
                return ele;
            }else if(way[1].search(/sub{1}/) != -1){
                if(maths[1] >= 1 && maths[1] <= element.length){
                    var ele = new Array(); //暂存对象
                    var l = 0;
                    for(var k = maths[0];k <= element.length;k++){
                        l++;
                        if(l <= Number(maths[1])){
                            ele[ele.length] = element[k - 1];
                        }
                    }
                    return ele;
                }else{
                    return element;        
                }
            }else if(way[1].search(/eq{1}/) != -1){
                return element[maths[0]-1];
            }
        }else{
            return element;    
        }
    }
    
}/* 调用 */
var aa = GetClass("classname:fed(0)"); //取得第一个

解决方案 »

  1.   

    函数的注释写到函数前边去
    函数名和变量名的首字母要小写var way = new Array()   ->    var way = [];
    var Reg = new RegExp(/:{1}/);  常态的正则就不要new了,可以直接/:{1}/, 可是/:{1}/是什么呢? 还有下边的fed{1}, led{1}, \d{1} 不解
    way[1]?mar=true:mar=false;  不带这么玩的,可以写成: mar = !!way[1];  下边的mar?classel=way[0]:classel=ClassName;也一样
    if((way[1].search(/fed{1}/) != -1) || (way[1].search(/led{1}/) != -1) || (way[1].search(/eq{1}/) != -1)){ 一个正则能解决的问题就不要用多个
        maths[0] = Number(way[1].match(/\d{1}/)) + 1;   一个正则操作能解决的问题,就不要用多个
    其实你这一整个字符串解析的过程都可以用一个正则来解决 : /[\w\d]+(:(fed|led|eq|sub)\{\s*\d+\s*(\,\d+)?\s*\})?/  (大概写的,没测试)
    i < elements.length  这要计算好多次.length
    way[1] 常使用的访问最好用有意义的变量保存下来
    ..........算了,不说了
      

  2.   


    谢谢牛人指点。至于你说的那个东西,看看注释就知道了
    /* kangyangyang 2010-01-12
         * 为空获取全部集合
         * first 获得集合第一个元素 --异常抛出错误 -- 单个对象
         * last 获取集合最后一个元素 --异常抛出错误 -- 单个对象
         * eq(1) 获取第二个元素。 下标从0算起 --异常返回全部对象集合 -- 数组对象
         * fed(2) 获取前三个 下标从0算起  --异常返回全部对象集合 -- 数组对象
         * led(2) 获取后两个 下标从0算起   --异常返回全部对象集合 -- 数组对象
         * sub(2,2)获取第二个到第四个  --异常返回全部对象集合 -- 数组对象
         */