$get() == document.getElementById()

本文详细解析了$get()函数的实现原理及其与getElementById()的关系,通过实例展示了如何利用这两个方法来搜索HTML元素,并说明了在存在重复ID的情况下它们的不同行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

$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>
 

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值