2012-03-21 17 views
7

następujące utwory:Set document.getElementById do zmiennej

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

nie:

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

Wszelkie pomysły, dlaczego to nie działa i jak zrobić to tak?

+0

można znaleźć swoją odpowiedź między liniami w tym poście/odpowiedzi: http://stackoverflow.com/a/9612657/77047 –

+0

nie jestem pewien, że to e xact duplicate per se, ale dotyczy to tego samego terenu co http://stackoverflow.com/questions/6398787/javascript-shorthand-for-getelementbyid – lonesomeday

Odpowiedz

0

Jeśli próbujesz osiągnąć coś takiego, proponuję użyć jQuery. Ich notacja $ jest znacznie potężniejsza niż po prostu otrzymanie elementu po id.

Ponadto, jeśli używasz platformy, która już używa zmiennej $ jako zmiennej (ASP .Net czasami używa tego), możesz mieć nieprzewidywalny wynik.

10

Wartość this zależy od sposobu wywołania funkcji.

Po wywołaniu document.getElementById następnie getElementById otrzymuje this === document. Po skopiowaniu getElementById do innej zmiennej, a następnie wywołanie go jako $, następnie this === window (ponieważ window jest zmienną domyślną).

To powoduje, że szuka identyfikatora w obiekcie okna, a nie w obiekcie dokumentu, a to się nie udaje, ponieważ okna nie są dokumentami i nie mają tych samych metod.

Musisz zachować document w rozmowie. W tym celu można użyć funkcji opakowania.

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

... ale proszę nie używać $. To okropne imię. To nie ma znaczenia i będzie mylić ludzi, którzy widzą to i myśleć "Ach, znam jQuery!" lub "Ah! Wiem prototyp" lub itp.

+1

$ ma znaczenie "id selektora metody", więc wszystko jest w porządku z tym. – Bergi

+1

@Bergi - Nie, nie ma. W jQuery na przykład oznacza "Pobierz kolekcję elementów z selektora CSS ** lub ** wygeneruj kolekcję węzłów z fragmentu HTML ** lub ** uruchom tę funkcję, gdy wystąpi zdarzenie DOMReady". – Quentin

+1

Spójrz na [te komentarze] (http://stackoverflow.com/a/6398800/1048572). Ponadto, jQuery jest bardzo dobrym przykładem, dlaczego nie powinieneś przeciążać funkcji selektora kolekcjonowania super-duperów. – Bergi

1

getElementById to metoda prototypu HTMLDocument (z czego document jest instancją). Zatem wywołanie funkcji w kontekście globalnym na pewno dostaniesz "Zły ten błąd" lub coś podobnego.

Można użyć

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

ale

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

jest OK, a może lepiej zrozumieć.

1

nie wiem, co chcesz osiągnąć, ale może to być praca tak

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

ponieważ getElementById działa tylko gdy jest to funkcja document ze względu na zakres potrzebuje.

Ale polecam @ Quentina.

+0

Demo: http://jsfiddle.net/5V5w3/ – Zeta

4

Obiekt kontekstu jest inny.Gdy pojawi się odniesienie do funkcji jesteś zmianę tego obiektu kontekstowego:

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" 

Jeśli chcesz funkcję odniesienia związanego z konkretnym obiektem kontekstowego, trzeba użyć bind:

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

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

Tak w Twoim przypadku będzie to:

var $ = document.getElementById.bind(document); 
Powiązane problemy