Присвоение document.getElementById другой функции - PullRequest
3 голосов
/ 17 апреля 2010

Я пытаюсь сделать следующее в JavaScript:

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);
};

Но по какой причине я получаю указанное выше исключение при назначении функции другому имени?

Ответы [ 3 ]

5 голосов
/ 17 апреля 2010

Чтобы вызвать псевдоним document.getElementById в Firefox и Google Chrome, вы должны сделать это следующим образом:

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

Возможно, вы захотите проверить следующую статью переполнения стека для подробного объясненияэто:

4 голосов
/ 17 апреля 2010

ECMAScript 5 представляет функцию bind(), которая связывает функцию с объектом, так что ее можно вызывать напрямую, не используя func.call(thisObj) для каждого вызова.

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

bind() впервые был доступен в библиотеке Prototype , а затем был добавлен в язык.

1 голос
/ 17 апреля 2010

Вы можете связать или позвонить или применить, если хотите, или вы можете назначить функцию напрямую, как вы заметили -

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

Но почему бы не улучшить это немного, или какая польза?

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