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?
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?
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.
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.
$ ma znaczenie "id selektora metody", więc wszystko jest w porządku z tym. – Bergi
@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
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
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ć.
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.
Demo: http://jsfiddle.net/5V5w3/ – Zeta
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);
można znaleźć swoją odpowiedź między liniami w tym poście/odpowiedzi: http://stackoverflow.com/a/9612657/77047 –
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