【问题标题】:what is document.getElementById?什么是 document.getElementById?
【发布时间】:2011-10-30 19:36:17
【问题描述】:

考虑以下代码:

<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 => “函数”
String => "函数#funcName#{[本机代码]}"
instanceof 对象 => 真
instanceof 函数 => 真
有点奇怪,我们可以使用()轻松调用w,但是对于g,我们必须像这样调用它:

g.call(document,elementId);

在 IE 6 中,结果完全不同:


//g
typeof => "对象"
String => "函数 getElementById{[本机代码]}"
instanceof 对象 => 假
instanceof 函数 => 假
//w
typeof => "函数"
String => "函数 testFunc{alert('test')}"
instanceof 对象 => 真
instanceof 函数 => 真
更重要的是,我们必须使用'()'直接运行g和w,我们不能这样调用g:

g.call(document,'t')

这将导致错误。 所以这是我的问题:document.getElementById 是什么,函数还是对象,g 和 w 之间的区别是什么?

【问题讨论】:

  • 这里的答案是停止支持IE6,让它死掉=D
  • DOM 接口不必表现得像本机 JavaScript 函数/对象。
  • @Tejs:都赞成说:赞成!
  • 在 IE7 上也报告了 IE6 行为,getElementsByTagName

标签: javascript


【解决方案1】:

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

4.3.8主机对象

宿主环境提供的完成ECMAScript执行环境的对象

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

宿主对象并不总是遵守与原生对象相同的规则 w.r.t。 typeof 虽然 EcmaScript 5 的 11.4.3 部分已经收紧了一些规则。

testFunc 是一个原生对象,具体来说是一个原生函数。

4.3.6 原生对象

ECMAScript 实现中的对象,其语义完全由本规范而非宿主环境定义。

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

【讨论】:

    【解决方案2】:

    这是用户代理实现的差异,是 IE6 和 1992 年之后制造的任何其他浏览器之间的数百种差异之一。只要最终功能与规范相似,差异很小如何 用户代理完成功能(当然,性能除外)

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

    也就是说:不支持IE6。真的没有(我的意思是NO)担心它,就像您担心 AOL5.0 原生浏览器一样。

    【讨论】:

      【解决方案3】:

      如果你的根本问题是跨浏览器兼容性,你为什么不这样做

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

      要获得一个像getElementById一样工作的保证普通的一流功能?

      【讨论】:

        【解决方案4】:

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

        我想 IE6 将 typeof 显示为原生函数 object 但它不是任何实例,因为它被浏览器识别并作为原生函数执行。

        虽然最后并不重要 - 你永远不需要知道 document.getElementById 的类型,尤其是在这么旧的浏览器中......

        【讨论】:

          【解决方案5】:

          document.getElementById 是一个函数。 IE6 刚出去吃午饭。也许如果你描述你真正想要解决的问题,人们可以提供帮助。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-02-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-10-23
            • 2014-11-13
            • 2011-02-07
            相关资源
            最近更新 更多