首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > JavaScript >

关于JQuery选择器解决办法

2012-10-19 
关于JQuery选择器hello大家好这边想请问大家的不是jquery选择器怎么用而是想探讨下相关问题。小弟现在遇见

关于JQuery选择器
hello 大家好

这边想请问大家的不是jquery选择器怎么用而是想探讨下相关问题。

小弟现在遇见这么一个问题:  

程序接收到一个html文件,由于平台特殊性,木有浏览器一类的东东来解释html文件以及JS。现在能做的是将html文件用CPP解析出其中的数据进行下一环节的应用。 描述应该还算清晰吧?  

以前做过WEB的编程,但是不知道jquery的选择器的具体实现原理:

比如 $("ElementId")这样获取JQuery对象,是不是做全局遍历? 是对DOM对象做的遍历吧? 效率怎么样呢? 不知道频繁得使用这种遍历效率会怎么样。

想问的具体问题: 其实很简单,有哪位知道JQuery具体实现原理,或是有木有较好的文章推荐下,想在几天内用CPP实现JQuery选择器,我头大了好几倍……

[解决办法]
Jquery就是一个js代码库,没有任何特殊性,既然代码不能执行,你不用指望他了
你想多了,不能解析的代码就是普通的文本而已,你做什么选择器??根本就没有对像给你选择。选择出文本还差不多,按xml解析该不会有什么错
[解决办法]
jquery的selector 说白了也就是封装了解析CSS选择器的方法

你不能当html,那就当xml解析就行了,不过xml没有getElementById,getElementsByTagName,getElementsByClassName这样的API。

你就只能用解析XML的API来封装了,但如果要实现$('#id')这样的选择器,效率肯定和getElementById没得比的。

我个人认为,如果是规范的html文档且不大的话,当做字符串,用正则可能更好一些。

这是我自己写的UI, 你可以看看,只有selector的一部分

JScript code
    selector.model = {        template: {            'Id': (/^#(\w+)/), // 1: id            'Class': (/^\.(\w+)/), // 1: class            'Tag': (/^([a-z]+[1-7]*)/i), // 1: tag            'Attr': (/^\[(\w+?)(([~\^\$\*]*=)(['"])(.*?)\4)*\]/), // 1: attr; 3: flag; 5: value;            'Child': (/^>/),            'Sibling': (/^\+/),            'Next': (/^\s+/)         },        byId: function(id) {            return d.getElementById(id)? [d.getElementById(id)] : [];            },        byTag: function(parent, tag) {            var result = [];            var stag = tag? tag : '*'            var temp;            ui.each(parent, function(v, i) {                temp = v.getElementsByTagName(stag);                if(temp) {                    result = result.concat(ui.toArray(temp));                }            });            var ss = result;            return result;        },        byChild: function(parent, tag) {            var result = [];            ui.each(parent, function(v, i) {                childs = ui.toArray(v.childNodes);                ui.each(childs, function(vi, ii) {                    if(vi.nodeType == 1) {                        if(!tag || (tag && vi.nodeName.toLowerCase() == tag)) {                            result.push(vi);                                }                        }                                        });                                });                return result;        },        bySibling: function(nodes, tag) {            var result = [];            var temp;            ui.each(nodes, function(v, i) {                temp = v;                                    while(temp.nextSibling) {                    temp = temp.nextSibling;                    if(temp.nodeType == 1) {                        if(!tag || tag && temp.nodeName.toLowerCase() == tag) {                            result.push(temp);                            break;                        }                        }                }                                    });            return result;        },                byAttr: function(nodes, k, v, f) {            var result = [];            var fi = f? f : '=';            var vi = v? v : '\[\.\\s\\S]\+';            var reg = fi == '~='? '(^|\\s)' + vi + '(\\s|$)' : fi == '^='? '^' + vi : fi == '$='? vi + '$' : fi == '*='? vi : '^' + vi + '$';            reg = new RegExp(reg);            var ki = ui.browser.ie && k == 'class'? 'className' : k;            var att;            ui.each(nodes, function(vii, i) {                att = vii.getAttribute(ki);                if(att && reg.test(att)) {                    result.push(vii);                    }                                   });                                return result;        },        byClass: function(nodes, cl) {            var result = [];            var reg = new RegExp("(^|\\s)" + cl + "(\\s|$)");            ui.each(nodes, function(v, i) {                if(v.nodeType == 1 && reg.test(v.className)) {                    result.push(v);                    }                                   });            return result;        }    }; 

热点排行