开发者社区> 问答> 正文

请问这段简单的query怎么理解?

 function $(selector) {
    var allchilds = [];
    var childs = function (element) {
        return element.getElementsByTagName('*');
    }

    var ele = document.getElementsByTagName('html')[0]; 
    var sele = selector.replace(/\s+/, ' ').split(' '); //为什么要空格去替换空格呢?


    for (var i = 0, len = sele.length; i < len; i++) {
        ele = childs(ele);
        var eleLen = ele.length;
        var isGet = false;//这行代码的意义?

        switch (sele[i][0]) {
            case '#':
                for (var j = 0; j < eleLen; j++) {
                    if (ele[j].id === sele[i].substring(1)) { 
                        ele = ele[j];
                        isGet = true;
                        break;
                    }
                }
                break;
            case '.':
                for (var j = 0; j < eleLen; j++) {
                    var name = uniqArray(ele[j].className.split(' '));
                    if (name.indexOf(sele[i].substring(1)) !== -1) { //括号中内容的意思??
                        ele = ele[j];
                        isGet = true;
                        break;
                    }
                }
                break;
            case '[':
                var valueLoc = sele[i].indexOf('=');
                if (valueLoc !== -1) {
                    var key = sele[i].substring(1, valueLoc);
                    var value = sele[i].substring(valueLoc + 1, sele[i].length - 1);
                    for (var j = 0; j < eleLen; j++) {
                        if (ele[j][key] === value) {
                            ele = ele[j];
                            isGet = true;
                            break;
                        }
                    }
                }
                else {
                    var key = sele[i].substring(1, sele[i].length - 1);
                    for (var j = 0; j < eleLen; j++) {
                        if (ele[j][key]) {
                            ele = ele[j];
                            isGet = true;
                            break;
                        }
                    }
                }
                break;
            default :
                for (var j = 0; j < eleLen; j++) {
                    if (ele[j].tagName === sele[i].toUpperCase()) {
                        ele = ele[j];
                        isGet = true;
                        break;
                    }
                }
                break;
        }
    }

    if (!isGet) {
        ele = null;
    }

    return ele;
}

万分感谢

展开
收起
小旋风柴进 2016-03-19 11:10:39 1760 0
1 条回答
写回答
取消 提交回答
  • var sele = selector.replace(/s+/, ' ').split(' '); //为什么要空格去替换空格呢?
    这个是这则,s代表空字符不一定是空格,r n,t这种都算,或者传递多个空格统一替换为1个空格,防止split分割后得到多个空项

    isGet代表传入的选择器是否正确,有匹配的项目,没有就返回null

    if (!isGet) {
        ele = null;
    }

    这个是样式选择器,传入类型.xxxx的值,不懂你的uniqArray怎么写的,应该是将元素的样式变为字符串之类的,然后用元素的样式查询传入的选择器(要去掉第一个点内容,元素样式没有电)的是否在其中

    (.indexOf()!=-1)
                    case '.':
                    for (var j = 0; j < eleLen; j++) {
                        var name = uniqArray(ele[j].className.split(' '));
                        if (name.indexOf(sele[i].substring(1)) !== -1) { //括号中内容的意思??
                            ele = ele[j];
                            isGet = true;
                            break;
                        }
                    }
                    break;
    2019-07-17 19:07:44
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载