Установите document.getElementById в переменную - PullRequest
7 голосов
/ 21 марта 2012

работают следующие работы:

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

Это не:

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

Есть идеи, почему это не работает или как это сделать?

Ответы [ 5 ]

11 голосов
/ 21 марта 2012

Значение this зависит от того, как вы вызываете функцию.

Когда вы вызываете document.getElementById, тогда getElementById получает this === document.Когда вы копируете getElementById в другую переменную и затем называете ее как $, тогда this === window (потому что window является переменной по умолчанию).

Это заставляет его искать идентификатор вобъект окна вместо объекта документа, и это ужасно терпит неудачу, потому что окна не являются документами и не имеют одинаковых методов.

Вам необходимо сохранить document в вызове.Для этого вы можете использовать функции-оболочки, например,

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

… но, пожалуйста, не используйте $.Это ужасное имя.Это не имеет смысла, и это сбивает с толку людей, которые видят это и думают: «Ах! Я знаю jQuery!»или "Ах! Я знаю прототип" или т. д. и т. д.

4 голосов
/ 21 марта 2012

Объект контекста отличается. Когда вы получаете ссылку на функцию, вы меняете этот контекстный объект:

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);
1 голос
/ 21 марта 2012

Не знаю, чего вы хотите достичь, но это можно сделать, работая так

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

, потому что getElementById работает только тогда, когда это функция document из-за области его действиянужно.

Но я бы порекомендовал @ ответ Квентина.

1 голос
/ 21 марта 2012

getElementById - это метод прототипа HTMLDocument (экземпляр которого document).Таким образом, вызывая функцию в глобальном контексте, вы обязательно получите «Wrong this Error» или что-то в этом роде.

Вы можете использовать

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

, но

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

также хорошо и, возможно, лучше понять.

0 голосов
/ 21 марта 2012

Если вы пытаетесь достичь чего-то подобного, я бы предложил использовать jQuery . Их нотация $ намного мощнее, чем просто получение элемента по id.

Кроме того, если вы используете какую-либо платформу, которая уже использует $ в качестве переменной (ASP .Net иногда использует это), вы можете получить непредсказуемый результат.

...