2012-03-21 46 views
7

以下工作:设置的document.getElementById可变

$ = document.form; 
    x = $.name.value; 

这不:

$ = document.getElementById; 
    x = $("id").value; 

为什么这不工作或如何使它所以任何想法?

+0

您可能会发现字里行间你的答案在这个岗位/回答:http://stackoverflow.com/a/9612657/77047 – 2012-03-21 12:48:38

+0

我不知道这是一封xact重复本身,但这涵盖了相同的基础http://stackoverflow.com/questions/6398787/javascript-shorthand-for-getelementbyid – lonesomeday 2012-03-21 12:50:44

回答

0

如果你正试图达到这样的东西,我会建议使用jQuery。他们的$符号比仅仅通过id获取元素更加强大。另外,如果您使用任何已经使用$作为变量的平台(ASP .Net有时会使用此变量),则可能会产生不可预测的结果。

10

this的值取决于您如何调用该函数。

当您拨打document.getElementByIdgetElementById得到this === document。当您将getElementById复制到不同的变量,然后将其作为$然后this === window(因为window是默认变量)。

然后,这会导致它在窗口对象中而不是在文档对象中查找id,并且由于窗口不是文档而且没有相同的方法,所以可能会非常糟糕。您需要在通话中维护document。你可以使用一个包装函数来处理这个例如

function $ (id) { return document.getElementById(id); } 

...但是请不要使用$。这是一个可怕的名字。它没有任何意义,它会让看到它的人感到困惑,并且会想“啊!我知道jQuery!”或“啊!我知道原型”等等。

+1

$有“ID选择器方法”的含义,所以一切都OK了。 – Bergi 2012-03-21 12:52:59

+1

@Bergi - 不,它没有。例如,在jQuery中,它的意思是“从CSS选择器获取元素的集合**或**从HTML **的片段生成节点的集合或者**在DOMReady事件触发时运行此函数”。 – Quentin 2012-03-21 12:56:18

+1

看看[这些评论](http://stackoverflow.com/a/6398800/1048572)。此外,jQuery是一个非常好的例子,您为什么不应该重载超级集合选择器函数。 – Bergi 2012-03-21 13:02:48

1

getElementByIdHTMLDocument原型(其中document是一个实例)的方法。所以,在全局环境中调用函数,你肯定会得到“错误的错误”或什么的。

您可以使用

var $ = document.getElementById.bind(document); 

function $(id) { return document.getElementById(id); } 

也行,也许更好的理解。

1

不知道你想达到的目标,但是这可犯了这样的

$ = document.getElementById; 
x = $.call(document, "id").value; 

因为getElementById作品只有当它是因为它需要范围的document功能工作。

但我会推荐@昆汀的答案。

+0

演示:http://jsfiddle.net/5V5w3/ – Zeta 2012-03-21 12:53:04

4

上下文对象不同。当你得到一个函数的引用您要改变这种情况下对象:

var john = { 
    name : "john", 
    hello : function() { return "hello, I'm " + this.name } 
} 

var peter = { name : "peter" }; 

peter.hello = john.hello; 

peter.hello() // "hello, I'm peter" 

如果你想绑定到特定的上下文对象的引用功能,你必须使用bind

peter.hello = john.hello.bind(john); 

peter.hello(); // "hello, I'm john" 

所以在你的情况将是:

var $ = document.getElementById.bind(document);