什么是document.getElementById?

时间:2011-08-19 17:35:41

标签: javascript

请考虑以下代码:

<script>
function testFunc(){
    alert('test')
}
$(function(){
    var g = document.getElementById , w = window.testFunc ;
    //g
    alert(typeof(g));
    alert(String(g));
    alert(g instanceof Object);
    alert(g instanceof Function);
    //w
    alert(typeof(w));
    alert(String(w));
    alert(w instanceof Object);
    alert(w instanceof Function);
    //run it
    alert(g('t'));
            w();

});
</script>

代码在现代浏览器(chrome,IE 9,Firefox)中的行为相同。结果是:

typeof =&gt; “功能”
String =&gt; “function #funcName#{[native code]}”
instanceof Object =&gt;真正
instanceof Function =&gt;真正
这有点奇怪,我们可以使用w轻松调用(),但对于g,我们必须像这样调用它:

g.call(document,elementId);

说到IE 6,结果完全不同:


//克
typeof =&gt; “对象”
String =&gt; “function getElementById {[native code]}”
instanceof Object =&gt;假
instanceof Function =&gt;假
// w ^
typeof =&gt; “功能”
String =&gt; “function testFunc {alert('test')}”
instanceof Object =&gt;真正
instanceof Function =&gt;真正
更重要的是,我们必须使用'()'直接运行g和w,我们不能像这样调用g:

g.call(document,'t')

这会导致错误。 所以这是我的问题:什么是document.getElementById,函数或对象,以及gw之间的差异是什么?

5 个答案:

答案 0 :(得分:7)

document.getElementById是一个宿主对象,它是一个函数。它没有在EcmaScript中定义,但是是DOM接口的一部分。

  

4.3.8主机对象

     

主机环境提供的对象,以完成ECMAScript的执行环境

由于它支持[[Call]]运算符,因此它也是一个函数。

主机对象并不总是遵循与本机对象w.r.t相同的规则。 typeof虽然EcmaScript 5的11.4.3部分已经在某种程度上收紧了规则。

testFunc是本机对象,特别是本机函数。

  

4.3.6原生对象

     

ECMAScript实现中的对象,其语义完全由此规范定义,而不是由主机环境定义。

     

注意本规范中定义了标准本机对象。一些本机对象是内置的;其他可能是在执行ECMAScript程序的过程中构建的。

答案 1 :(得分:2)

这是用户代理实现的一个区别,在IE6和1992年之后制作的任何其他浏览器之间可以找到数百个之一。只要最终功能类似于规范,它就会产生很小的差异如何用户代理完成功能(当然,性能除外)

查看此实施差异图表:http://webcoder.info/reference/BrowserFiltering.script.html

那说:不支持IE6。实际上没有(我的意思是 NO )理由担心它,而不是担心AOL5.0本机浏览器。

答案 2 :(得分:1)

如果您的基本问题是跨浏览器兼容性,那么为什么不这样做呢

 var g = function(id) { return document.getElementById(g) };

获得一个像getElementById一样有保障的普通头等功能?

答案 3 :(得分:0)

document.getElementById是一个功能。 IE6刚出去吃午饭。也许如果你描述了你真正试图解决的问题,人们可以帮助解决这个问题。

答案 4 :(得分:0)

g是所有浏览器中的本机函数,而w则不是。typeof。 IE显示不同的字符串结果,因为浏览器格式化为字符串不同的函数,这就是为什么你不应该首先将函数转换为字符串。

我认为IE6将object本机函数显示为document.getElementById,但它不是任何实例,因为它被浏览器识别并执行为本机函数。

最后并不重要 - 你永远不需要知道{{1}}的类型,特别是在这么老的浏览器中......