2010-04-16 50 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)}