$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 ;
}
// 参数含义:
// 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 >
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 >