$get() == document.getElementById()

$get() == document.getElementById()只有原始和封装的区别。getElementById 是基本上每种封装最终都要调用到的。
alert($get) 就可以看到这个函数的代码,我详细注释了一下贴给你参考:
 
//  功能:搜索一个指定 id 的 HTML 元素。
//
 参数含义:
//
 id: 元素的 id
//
 element: 可选参数,如果提供了,则代表要从哪个元素开始搜索它的子节点 DOM 树,
//
      这里会涉及到一个对 DOM 树的递归遍历。
//
      如果未提供此参数,则直接从 document 中根据指定的 id 查找对象。
function  Sys$UI$DomElement$getElementById(id, element) {
    
//  验证参数的有效性

    
// / <param name="id" type="String"></param>
     // / <param name="element" domElement="true" optional="true" mayBeNull="true"></param>
     // / <returns domElement="true" mayBeNull="true"></returns>
     var  e  =  Function._validateParams(arguments, [
        {name: 
" id " , type: String},
        {name: 
" element " , mayBeNull:  true , domElement:  true , optional:  true }
    ]);
    
if  (e)  throw  e;

    
//  没有传递第二个参数的情况下,直接根据 id 让 document 去查找就可以了。
     if  ( ! element)  return  document.getElementById(id);
    
//  element 可能具有 getElementById 方法,为什么这么判断,因为它也可以是一个 document 对象。
     //  比如你要获取父窗体页面中的指定 id 的对象,就可以:
     //  $get("someId", parent.document);
     if  (element.getElementById)  return  element.getElementById(id);

    
var  nodeQueue  =  [];
    
var  childNodes  =  element.childNodes;
    
//  收集 element 的所有元素子节点到一个队列中
     for  ( var  i  =   0 ; i  <  childNodes.length; i ++ ) {
        
var  node  =  childNodes[i];
        
//  nodeType 为1的是 element, 为3的是 text.
         if  (node.nodeType  ==   1 ) {
            nodeQueue[nodeQueue.length] 
=  node;
        }
    }
    
//  依次从队列中查找元素是否满足 id 的条件(注意:在此过程中队列会动态增减),
     //  直到队列为空(表示所有都查找过了)。
     while  (nodeQueue.length) {
        
//  将头部的元素出队列
        node  =  nodeQueue.shift();
        
//  判断其 id 是否等于要找的 id, 找到则返回
         if  (node.id  ==  id) {
            
return  node;
        }
        
//  否则,开始遍历到下一层。将 node 的子元素进队列(从尾部进入)
        childNodes  =  node.childNodes;
        
for  (i  =   0 ; i  <  childNodes.length; i ++ ) {
            node 
=  childNodes[i];
            
if  (node.nodeType  ==   1 ) {
                nodeQueue[nodeQueue.length] 
=  node;
            }
        }
    }
    
//  各种办法都找遍了,找不到只好返回 null
     return   null ;
}

$get 遍历 DOM 树还有一层意义,就是一个 html 文档里 id 是可以重复的,在某种情况下遍历 DOM 查找对比能够区分开重复 id 的元素。比如考虑下面的例子,两个 alert 的结果是不一样的:
< SCRIPT  LANGUAGE ="JavaScript" >
    
function  mytest(){
        alert($get(
" test " ).innerHTML);
        alert($get(
" test " , $get( " div2 " )).innerHTML);
    }
</ SCRIPT >

< div  id ="div1" >
    
< div  id ="test" > test1 </ div >
</ div >
< div  id ="div2" >
    
< div  id ="test" > test2 </ div >
</ div >

< button  onclick ="mytest()" > mytest </ button >
 

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值