Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Set document.getElementById to variable

The following works:

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

This doesn't:

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

Any ideas on why this doesn't work or how to make it so?

like image 222
Bret Thomas Avatar asked Mar 21 '12 12:03

Bret Thomas


2 Answers

The value of this depends on how you call the function.

When you call document.getElementById then getElementById gets this === document. When you copy getElementById to a different variable and then call it as $ then this === window (because window is the default variable).

This then causes it to look for the id in the window object instead of in the document object, and that fails horribly because windows aren't documents and don't have the same methods.

You need to maintain the document in the call. You can use a wrapper functions for this e.g.

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

… but please don't use $. It is a horrible name. It has no meaning and it will confuse people who see it and think "Ah! I know jQuery!" or "Ah! I know Prototype" or etc etc.

like image 74
Quentin Avatar answered Oct 08 '22 00:10

Quentin


The context object is different. When you get a reference of a function you're changing that context object:

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"

If you want a reference function bound to a specific context object, you have to use bind:

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

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

So in your case it will be:

var $ = document.getElementById.bind(document);
like image 34
ZER0 Avatar answered Oct 08 '22 00:10

ZER0