hello  大家好这边想请问大家的不是jquery选择器怎么用而是想探讨下相关问题。小弟现在遇见这么一个问题:  程序接收到一个html文件,由于平台特殊性,木有浏览器一类的东东来解释html文件以及JS。现在能做的是将html文件用CPP解析出其中的数据进行下一环节的应用。 描述应该还算清晰吧?  以前做过WEB的编程,但是不知道jquery的选择器的具体实现原理:比如 $("ElementId")这样获取JQuery对象,是不是做全局遍历?  是对DOM对象做的遍历吧?  效率怎么样呢?  不知道频繁得使用这种遍历效率会怎么样。想问的具体问题: 其实很简单,有哪位知道JQuery具体实现原理,或是有木有较好的文章推荐下,想在几天内用CPP实现JQuery选择器,我头大了好几倍……

解决方案 »

  1.   

    因为你说了,你的这些操作不是基于浏览器的就好比你有一个字符串,你想得到字符串中的某一部份特定内容。你用正则匹配把它们揪出来不行?怎么想到仿jquery?
      

  2.   

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

  3.   

    嗯  说的没错哦  那得老老实实按xml来解析了……
      

  4.   

    关键是内容比较多  要把这个html文件里的信息转化为结构化的数据  而且不只一个html文件  我是想写个库方便整个工程来引用的  呵呵  代码复用嘛  要是每个文件都用正则来处理就很不规范了……谢谢回复哈
      

  5.   

    刚学会用jquery选择器,就看到有人要写个选择器出来,大神们发飙吧,最好贴出代码来让咱也瞧瞧
      

  6.   

    <font colr="red">红色的?</font>
      

  7.   

    写出来应该不难  因为已经有jquery可借鉴了  呵呵还有,CSDN怎么老吞楼? 我看到有6个回复怎么都没显示出来  
      

  8.   

    选择器根本不难,基本就是js原本的获取方法,或者获取所有对象后进行遍历,
    主要是在jquery对象上扩展的dom操纵的函数方法有些很有用
      

  9.   

    这个你去看看jquery的源代码吧,它是开源的呀。$("elementId")这是很快的。不需要全部的,根据className、Name来找要全部的。
      

  10.   

    这个你去看看jquery的源代码吧,它是开源的呀。$("elementId")这是很快的。不需要全部的,根据className、Name来找要全部的。
      

  11.   

    jquery的selector 说白了也就是封装了解析CSS选择器的方法你不能当html,那就当xml解析就行了,不过xml没有getElementById,getElementsByTagName,getElementsByClassName这样的API。你就只能用解析XML的API来封装了,但如果要实现$('#id')这样的选择器,效率肯定和getElementById没得比的。我个人认为,如果是规范的html文档且不大的话,当做字符串,用正则可能更好一些。这是我自己写的UI, 你可以看看,只有selector的一部分
    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;
    }
    };
      

  12.   

    嗯 已经通过xml解析类封装成getElementById,getElementsByTagName这些东东了,看下具体应用吧,如果有需要再做成方便一点的选择器。  谢了哈  。  你的代码挺漂亮的哦!
      

  13.   

    querySelector
    querySelectorAll
    才是王道