document.getElementById()与getElementById()有何区别?

3

我经常通过以下方式为某些事件注册JavaScript函数:

myBtn.Attributes.Add("onClick", "Validate(getElementById('"+txtFirstName.ClientID + "'));");

我一直只使用getElementById,即不需要在其前面加上document。但是最近当我使用getElementById而不是document.getElementById时,我的页面会出现错误。为什么会这样?奇怪的是,我有一个网站,在一个页面上我可以只使用getElementById,但是在另一个页面上,如果我只用getElementById,它会抛出JavaScript错误,只有当我使用document.getElementById它才能正常工作。

有人知道原因吗?无论是否存在文档前缀,我都应该到处使用document.getElementById吗?

编辑: 这与一个页面使用AJAX和另一个页面没有使用有关吗?


嘿,你能取消接受当前答案吗?它是错误的,可能会误导那些遇到这个问题的人。 - Ry-
6个回答

7

当你使用getElementById()函数并且它能够工作时,这意味着这个函数所在的上下文是在文档中,也就是说,this==document

因此,为避免这种错误,你应该始终使用document.getElementById

无论如何,我建议你停止使用getElementById,转而使用JQuery。相信我,你永远不会后悔的。

如果你使用JQuery,你的代码将类似于:

$("#myBtnID").click(function () { Validate($("#myTextboxID"))});

1
+1,说真的,使用高质量的JS库非常实用。 - cgp
1
太棒了。我一定会去看看 JQuery。 - Jagd
8
抱歉,但是你的描述是错误的:当前的词法环境(即“上下文”)与this所引用的对象不同;如果使用普通的getElementById()可以正常工作,这并不意味着this == document,而是在封闭函数或全局对象(也称为window)中定义了一个具有该名称的变量。 - Christoph
1
@AlbertEin:当前的this对象不是“堆栈帧”的一部分 - 词法环境是由封闭函数的作用域、全局对象(window)和通过with()语句显式添加的任何对象构建的;如果您想访问由this引用的对象的属性,必须明确地这样做! - Christoph
8
对于如此极其错误的答案,它却有着非常多的赞。 - Timwi
显示剩余3条评论

3

如果您在没有拥有对象的情况下访问任何函数或变量(例如:document.getElementById),则会从 window 访问该属性。

因此,getElementById 实际上是 window.getElementById,除非您之前定义过它(例如:getElementById = document.getElementById),否则它不是原生定义的。


一些旧版本的 FF 和 IE 存在这个困境:一个使用 window.getElementById,另一个使用 document.getElementById。 - staticsan

1

你应该使用完整的document.getElementById()。如果你觉得这太啰嗦了,你可以使用jQuery:

$('#' + id)

或者你可以在脚本顶部创建一个别名:

var byID = document.getElementById;

1
你的别名可能无法工作,因为它没有将 this 绑定到 document 上;要使其工作,您需要使用 var byID = function(id) { return document.getElementById(id); }; - Christoph
1
我非常讨厌别名,但我一定会研究JQuery。感谢您的输入! - Jagd

1

你应该只使用document.getElementById(即使我建议使用像prototype或jquery这样的库来使用$符号)。

如果你能够单独使用getElementById,那只是因为你正在使用的浏览器正在做一些技巧来让它工作,但正确的方法是使用document变量。


0

我不太知道如何解释,但这是因为getElementById()在页面的HTML结构中查找元素。一些浏览器默认知道您要搜索文档,但其他浏览器需要额外的指导,因此需要使用document。


0

正确的方法确实是document.getElementById()

它可能本身就能工作的原因(推测)在于,根据您使用它的位置,当前上下文实际上可能是文档对象,因此不明显地导致了document.getElementById()。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接