2010-04-16 96 views
3

我试图做在JavaScript如下:分配的document.getElementById到另一个功能

var gete = document.getElementById; 

但我收到以下错误(从Firebug的控制台):

uncaught exception: [Exception... "Illegal operation on WrappedNative prototype object" nsresult: "0x8057000c (NS_ERROR_XPC_BAD_OP_ON_WN_PROTO)" location: "JS frame :: http://localhost:8080/im_ass1/ :: anonymous :: line 15" data: no]

现在很明显我可以把这个功能包装如下:

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

但是,当将函数分配给其他名称时,我得到上述异常的原因是什么?

+0

您是否使用Firefox和Firebug的最新版本?这样做我没有得到任何错误。 – 2010-04-16 22:56:02

+0

我目前的版本是:'3.6.3' – 2010-04-16 23:19:15

回答

5

要调用的火狐和谷歌Chrome document.getElementById的别名,你应该如下做:

var gete = document.getElementById; 
gete.call(document, 'header').innerHTML = 'new'; 

您可能想看看下面的堆栈溢出职位背后的详细解释:

+0

+1谢谢,马尔他同胞;-) – 2010-04-16 23:05:30

+0

@安德里亚斯:很高兴见到一个同胞! :) – 2010-04-16 23:09:00

2

Prototype JavaScript库提供了一种bind()函数将函数与对象绑定,以便可以直接调用函数,而无需为每个调用使用func.call(thisObj)

var func = document.getElementById.bind(document); 
func("foo"); // We don't have to use func.call(doument, "foo") 

bind()将是语言的一部分在ECMAScript中5

1

可以绑定或致电或者如果你喜欢的应用,或者你遵循 -

var gete= function(s){return document.getElementById(s)} 
您可以直接分配功能,

但是为什么不改善它一点,或者有什么用?

var gete= function(s){return s && s.nodeType==1? s: document.getElementById(s)}