itlw.Page.prototype.$J = function(element){
if(!this.root) return;
var selectId = "#"+element;
if(this.root.querySelector){
return this.root.querySelector(selectId);
}else{
    //有什么方法可以跟据ID得到Element

}
现在的业务是这样的:html有多个顶层div,这些div的id是唯一的。每个div有大量的html元素,如何在指定的顶层div里面快速地找到指定id的元素(就像document.getElementById("")功能)?首先,因为div里面不支持getElementById方法,其次,要找的这个元素不知道它任何信息只知道它的Id,如果div里有多个相同id的元素可以返回第一个满足条件的元素。现在我知道IE8以上、firefox都实现了dom2规范的  querySelector、querySelectorAll原生方法,可以快速通过id找到元素满足要求,现在就是IE6/IE7不知道要如何实现,注意:顶层div里会有很多的元素,可能有很多层,漫无目的的循环就怕性能太差,请大家说说有什么快速定位的方案吗?我看了jquery里的Selector,没怎么看懂,好像一到按ID查找就去到document.getElementById的原生方法里去了,但我要求是只要顶层div里找,因为多个顶层div可能会有很多相同的ID的元素,用document.getElementById找的话会找到第一个符合条件元素,这不是我想要的。实现意见: 首选IE里的原生方法,其次xpath什么的不知道能不能用得上。

解决方案 »

  1.   

    var objs = this.root.getElementsByTagName("div");
    for(int i=0;i<objs.length;i++){
      if(objs[i].id == selectId){
        return objs[i];
      }
    }
    return null;
      

  2.   

    this.root里有非常多的div,还有非常多的其它元素,一句话,你可以把 this.root理解为一个完整的页面,您的循环确实能达到要求,但是性能方面堪忧,因为$J这个函数的使用频率是非常高的。
    可能你没注意原贴:“漫无目的的循环就怕性能太差,请大家说说有什么快速定位的方案吗?”这句话。
      

  3.   

    this.root这里我以为是所查找的元素的父节点,你把这换成父节点不就行了吗
      

  4.   

    不行啊,因为我要做的是类似getElementById的功能,不清楚要找的节点是在 this.root的哪一层下面。
    但可以肯定的是this.root下的id是唯一的,如果不唯一就取第一个找到的元素就好了。但整个document有多个拥有this.root的div。引用document.getElementById就可能会找到其它div元素中的符合条件的元素了。所以不能用getElementById。
      

  5.   

    其实你设置的id有重复就是有问题的,因为id的目的就是唯一性
      

  6.   

    说起来就长了,我们准备预演一个新的框架,这个框架只有一个html,所有的页面就是一个json对象,这个json对象会说明这个页面有哪些组件,框架会跟据json对象去把整个页面画到一个顶层的div上面,你打开N个页面就会有N个顶层div,因为这个顶层div对应的json对象不可能知道别的顶层div定义了什么id,所以重复的id在所难免。首先说明,用重命名这些id可以解决id重复的问题,但是不方便开发人员的编程,因为它定义的被你重命名了,所以你必须告诉开发人员的重命名规则,这样做下去将比较麻烦。现在IE8和firefox都有原生方法querySelector、querySelectorAll支持了,不是问题,但是ie6/ie7不支持,但是这种浏览器几乎占了80%的用户,我们必需照顾到。
      

  7.   

    使用一个css选择器引擎来兼容老的浏览器
    http://localhost:8888/content/speedTest/index.html
      

  8.   

    不如想想现在标配的机器的性能吧,YUI都不在话下,循环div算什么。
      

  9.   

    其实jQ的选择器就是在遍历。
    这就是他效率低下的原因。
    我也正是因为他的效率,从他的崇拜者变成了反对者
    还有就是个“倒寻”,
    用getElementById获取,然后倒着找这个元素的parentNode||parentElement看他是否==你指定的那个父元素,如果不是,继续寻找父元素,直到寻找到document,然后return null;
      

  10.   

    楼上这个冒似可行,“继续寻找父元素”又用什么方法寻找呢?再用getElementById寻找还不是找到刚刚找的那个元素(也就是第一个元素。)。
      

  11.   

    楼主想搞一个比jquery 更牛的 js 框架!个人认为,那些js框架都是遍历去找的! 主要是优化查找的算法!在一个数组找出一个数,也要遍历撒!