是否有findAll的polyfill

时间:2014-06-08 10:34:37

标签: javascript html function

我正在使用JavaScript findAll作为选择器引擎。是否有findAll函数的polyfill。我尝试使用以下代码创建自己的选择器引擎:

function CTfind(string, context){
    var result = [], finalResult = [];
    if(typeof string === "object"){
        result.push(string);
        return result;
    }
    if(/<([a-zA-Z]+)(\s*)?\/>/ig.test(string)){
        var str = string.replace(/<([a-zA-Z]+)(\s*)?\/>/ig, "$1");
        var ret = document.createElement(str);
        if(typeof context === "object"){
            for(i in context)
                ret[i] = context[i];
        }
        document.body.appendChild(ret);
        result.push(ret);
        return result;
    } else{
        if(typeof string !== "string" && typeof string !== "object") return false;
        var documentElements = context.getElementsByTagName("*"),
        toMatch = string.split(", ");
        for(i = 0; i < documentElements.length; i++){
            for(e = 0; e < toMatch.length; e++){
                var stringParts = toMatch[e].split(" ");
                for(s = 0; s < stringParts.length; s++){
                    var parts;
                    if(/(\.|\#|\:)/g.test(stringParts[s])){
                        parts = stringParts[s].match(/([A-Za-z]+|[\.\#\:]+[^\.\#\:]+)/g);
                    } else if(/^(?!(\.|\#|\:)$).*$/g.test(stringParts[s])){
                        parts = stringParts[s];
                        var onlyElem = true;
                    }
                    if(onlyElem === true){
                        console.log(documentElements[i].nodeName);
                        if(documentElements[i].nodeName.toLowerCase() === parts){
                            result.push(documentElements[i]);
                        }
                    } else{
                        var containsClass = false,
                            containsElem = false,
                            containsID = false,
                            containsPseudo = false,
                            matchID = false,
                            matchElem = false,
                            matchClass = false,
                            matchPseudo = false;
                        if(/\./.test(stringParts[s])){
                            containsClass = true;
                        }
                        if(/\#/.test(stringParts[s])){
                            containsID = true;
                        }
                        if(/\:/.test(stringParts[s])){
                            containsPseudo = true;
                        }
                        if(/[^\.\#\:](.*)/.test(stringParts[s])){
                            containsElem = true;
                        }
                        if(containsElem === true){
                            var elem;
                            for(g = 0; g < parts.length; g++){
                                if(/^([^\.\#\:][A-Za-z])*$/.test(parts[g])){
                                    elem = parts[g];
                                } else{
                                    elem = documentElements[i].nodeName.toLowerCase();
                                }
                            }
                            if(documentElements[i].nodeName.toLowerCase() === elem){
                                matchElem = true;
                            }
                        } else{
                            matchElem = true;
                        }
                        if(containsID === true){
                            var id = filter(parts, "#");
                            id = id[0].substr(1);
                            if(getAttr(documentElements[i], "id") === id){
                                matchID = true;
                            }
                        } else{
                            matchID = true;
                        }
                        if(containsClass === true){
                            var classes = filter(parts, ".");
                            if(typeof classes === "string"){
                                classes = classes[0].split(".");
                                for(c = 0; c < classes.length; c++){
                                    if(classes[c] !== ""){
                                        if(hasClass(documentElements[i], classes[c])){
                                            matchClass = true;
                                        }
                                    }
                                }
                            }
                        } else{
                            matchClass = true;
                        }
                        if(matchClass && matchID && matchElem){
                            result.push(documentElements[i]);
                        }
                        console.log(result);
                    }
                }
                if(stringParts.length > 1){
                    console.log(result);
                    if(isDescendant(result[0], result[result.length - 1])){
                        finalResult.push(result[result.length - 1]);
                    }
                }
            }
        }
        return finalResult;
    }
};

但我认为使用Javascript findAll会更容易。另外,我不能使用querySelector,因为有时我需要在特定节点中找到它。

0 个答案:

没有答案