Skrót JavaScript dla getElementById


94

Czy istnieje skrót dla document.getElementById JavaScript? Czy jest jakiś sposób, żebym mógł je zdefiniować? To staje się powtarzalny przepisywania że nad i nad .


6
Nie wiem, kto ich zlekceważył, ale ktoś, kto nie jest na tyle zaznajomiony z Javascriptem, że nie wie, jak tworzyć takie skróty, może również napotkać problemy, gdy spróbuje go użyć, powiedzmy, jQuery i stwierdzi, że zmienna $ nie jest spójna. Prawidłowa odpowiedź brzmi „Nie, natywnie JavaScript nie oferuje skrótu, ale istnieje kilka struktur, które ułatwiają wybieranie węzłów DOM”.
kojiro

Odpowiedzi:


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

$( 'someID' )

Tutaj użyłem $, ale możesz użyć dowolnej prawidłowej nazwy zmiennej.

var byId = function( id ) { return document.getElementById( id ); };

byId( 'someID' )

6
@patrick dw Podoba mi się. Zwłaszcza z bogactwem poprawnych nazw zmiennych :)
Fox Wilson

4
„z bogactwem prawidłowych nazw zmiennych” - czy masz na myśli „co najmniej dwa główne frameworki JS już używają $, gratulacje, że też je wybrałeś ?”
Piskvor opuścił budynek

49
Nie ma znaczenia, ile bibliotek używa, $jeśli ich nigdy nie załadujesz.
user113716

7
Tak dla przypomnienia, kiedyś to robiłem var $ = document.getElementById.bind(document), ale bindnie jest dostępne we wszystkich przeglądarkach. Może jest to jednak szybsze, ponieważ używam tylko metod natywnych. Chciałem tylko to dodać.
pimvdb

7
@Piskvor: Nigdy nie koduję, aby uwzględnić ignorancję. Ignorancja prowadzi do zepsutego kodu. Zepsuty kod prowadzi do badań. Badania prowadzą do informacji. Ignorancja zostaje uleczona.
user113716

85

Aby zapisać dodatkowy znak, możesz zanieczyścić prototyp String w następujący sposób:

pollutePrototype(String, '绎', {
    configurable: false, // others must fail
    get: function() {
        return document.getElementById(this);
    },
    set: function(element) {
        element.id = this;
    }
});

function pollutePrototype(buildIn, name, descr) {
    var oldDescr = Object.getOwnPropertyDescriptor(buildIn.prototype, name);
    if (oldDescr && !oldDescr.configurable) {
        console.error('Unable to replace ' + buildIn.name + '.prototype.' + name + '!');
    } else {
        if (oldDescr) {
            console.warn('Replacing ' + buildIn.name + '.prototype.' + name + ' might cause unexpected behaviour.');
        }
        Object.defineProperty(buildIn.prototype, name, descr);
    }
}

Działa w niektórych przeglądarkach i możesz uzyskać dostęp do elementów w ten sposób:

document.body.appendChild(
    'footer'.绎 = document.createElement('div')
);
'footer'.绎.textContent = 'btw nice browser :)';

Nazwę nieruchomości wybrałem prawie przypadkowo. Jeśli naprawdę chcesz użyć tego skrótu, sugerowałbym wymyślenie czegoś łatwiejszego do wpisania.


12
绎 (Yì) - Unravel (chiński uproszczony)
AnnanFay

8
Zdajesz sobie sprawę, że wymaga to rozsądnego spadku wydajności. Metody pobierające / ustawiające zdefiniowane w prototypie są o rząd wielkości wolniejsze.
Raynos

5
może to być tylko jeden widoczny znak, ale zajmie to więcej niż jeden bajt w pliku ...
Alnitak

@Alnitak: o racja, nie pomyślałem o tym. Ponadto niektórzy ludzie (jak ja) nie mają klawisza 绎 na swoich klawiaturach, więc spędzaliby dużo czasu na kopiowaniu i wklejaniu go. Ale nazwa nie jest naprawdę ważna. Pierwotnie nazwałem właściwość „e” (jak element), ale pomyślałem, że ta nazwa może być już zajęta przez jakąś bibliotekę.
Robert

@Raynos: Tak, w moim teście porównawczym jest około trzy razy wolniejszy niż zwykła funkcja. 0,4 µs * 3 = 1,2 µs
Robert

18

Możesz łatwo stworzyć stenogramy samodzielnie:

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

@Sarfraz Czy najlepiej jest zadeklarować to jako zmienną czy funkcję? Czy to w ogóle ma znaczenie?
user1431627

@ user1431627: Jeśli przez zmienną masz na myśli wyrażenie funkcji, to ma to znaczenie pod względem zakresu. Funkcja zamieszczona w mojej odpowiedzi będzie dostępna wszędzie w kontekście jej wykonania. Zobacz: stackoverflow.com/questions/1013385/… lub kangax.github.io/nfe
Sarfraz

@Sarfraz Ok, dzięki :) jQuery obsługuje to w zmiennym zakresie, prawda? Powodem, dla którego pytam, jest to, że górna odpowiedź została napisana z zakresem zmiennej, ale napisałeś ją jako wyrażenie funkcji regularnej.
user1431627

13

Szybka alternatywa dla wniesienia wkładu:

HTMLDocument.prototype.e = document.getElementById

Następnie po prostu wykonaj:

document.e('id');

Jest pewien haczyk, nie działa w przeglądarkach, które nie pozwalają na rozszerzanie prototypów (np. IE6).


2
@ walle1357: Ten artykuł może Cię zainteresować.
user113716

5
@ThiefMaster „Don't ever do X” to najgorsza rada, jaką możesz dać. Poznaj alternatywy, zalety i wady i wybierz najlepszą odpowiedź na każdy problem. Nie ma nic złego w rozszerzaniu prototypu w tym przypadku (chociaż powinienem powiedzieć, że inne odpowiedzi są bardziej pasujące, ta pozostaje tylko do uzupełnienia)
Pablo Fernandez

Skąd wiesz, że nie zepsuje niczego w jakiejś przeglądarce ani w przyszłości?
ThiefMaster

@PabloFernandez: Nadal nie chcesz rozszerzać obiektów hosta. Jeśli przynajmniej dwie biblioteki chcą rozszerzyć obiekt hosta o identycznie nazwane właściwości, tylko pierwsza ostrożna biblioteka lub ostatnia niedbała biblioteka odniesie sukces.
Robert

1
@Robert to oczywiście nie jest najlepsza opcja, ale taka jest opcja. Musisz wziąć pod uwagę zalety i wady każdego z nich. Pamiętaj, że biblioteki javascript po stronie klienta zaczęły się od tego, prototype.jsktóre robiło dokładnie to samo.
Pablo Fernandez

8

(Skrót: nie tylko pobieranie elementu przez ID, ale także pobieranie elementu po klasie: P)

Używam czegoś takiego

function _(s){
    if(s.charAt(0)=='#')return [document.getElementById(s.slice(1))];
    else if(s.charAt(0)=='.'){
        var b=[],a=document.getElementsByTagName("*");
        for(i=0;i<a.length;i++)if(a[i].className.split(' ').indexOf(s.slice(1))>=0)b.push(a[i]);
        return b;
    }
}

Użycie: _(".test")zwraca wszystkie elementy o nazwie klasy test, a _("#blah")zwraca element o id blah.


6
Lepiej utwórz skrót dla document.querySelectorAll, zamiast próbować emulować część querySelectorAllmetody w funkcji niestandardowej.
Rob W

8

identyfikatory są zapisywane w window.

HTML

 <div id='logo'>logo</div>

JS

logo.innerHTML;

to to samo co pisanie:

document.getElementById( 'logo' ).innerHtml;

Nie radzę stosować tej pierwszej metody, ponieważ nie jest to powszechna praktyka.


Czy mógłbyś wyjaśnić, dlaczego nie sugerowałbyś stosowania tej metody?
Okku,

Nie widzę tego nigdy, ponieważ nie sądzę, że jest to praktyka zakładowa. Ale to najkrótszy sposób, aby to znaleźć.
im_benton

@Okku, ponieważ <div id="location"></div>i dzwonienie window.locationnie będzie działać.
Alex

7
<script>
var _ = function(eId)
{
    return getElementById(eId);
}
</script>

<script>
var myDiv = _('id');
</script>

6

Jest tu kilka dobrych odpowiedzi, a kilka tańczy wokół składni podobnej do jQuery, ale ani jedna nie wspomina o używaniu jQuery. Jeśli nie masz nic przeciwko, wypróbuj jQuery . Pozwala Ci wybierać elementy w bardzo prosty sposób.

Według ID :

$('#elementId')

Według klasy CSS :

$('.className')

Według typu elementu :

$('a')  // all anchors on page 
$('inputs')  // all inputs on page 
$('p a')  // all anchors within paragaphs on page 

3
Próbowałem jQuery, ale czy naprawdę potrzebuję całej biblioteki tylko dla skrótu getElementById?
Fox Wilson

Jaka jest „składnia podobna do jQuery” w innych odpowiedziach? W większości są to zwykłe stare funkcje, do których odwołują się zmienne. Nie ma w tym nic wyjątkowego w stylu jQuery. ; o)
user113716

3
@patrick dw, Dobra, twoja odpowiedź $ ('someID') w niczym nie przypomina selektora identyfikatora jQuery $ ('# someID') :)
Kon

5

Nie ma wbudowanej.

Jeśli nie masz nic przeciwko zanieczyszczaniu globalnej przestrzeni nazw, dlaczego nie:

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

EDYCJA - zmieniłem nazwę funkcji na coś niezwykłego , ale krótkiego i nie kolidującego z jQuery lub czymkolwiek innym, co używa gołego $znaku.


3

Tak, robi się monotonne użyć tę samą funkcję w ciągu i nad każdym z innym argumentem:

var myImage = document.getElementById("myImage");
var myDiv = document.getElementById("myDiv");

Więc fajną rzeczą byłaby funkcja, która pobiera wszystkie te argumenty w tym samym czasie:

function getElementsByIds(/* id1, id2, id3, ... */) {
    var elements = {};
    for (var i = 0; i < arguments.length; i++) {
        elements[arguments[i]] = document.getElementById(arguments[i]);
    }
    return elements;
}

Wtedy miałbyś odniesienia do wszystkich swoich elementów przechowywanych w jednym obiekcie:

var el = getElementsByIds("myImage", "myDiv");
el.myImage.src = "test.gif";

Ale nadal musiałbyś wymienić wszystkie te identyfikatory.

Możesz to jeszcze bardziej uprościć, jeśli chcesz, aby wszystkie elementy miały identyfikatory:

function getElementsWithIds() {
    var elements = {};
    var elementList = document.querySelectorAll("[id]");
    for (var i = 0; i < elementList.length; i++) {
        elements[elementList[i].id] = elementList[i];
    }
    return elements;
}

Ale wywołanie tej funkcji byłoby dość kosztowne, jeśli masz wiele elementów.


Więc teoretycznie, gdybyś użył withsłowa kluczowego, mógłbyś napisać kod w ten sposób:

with (getElementsByIds('myButton', 'myImage', 'myTextbox')) {
    myButton.onclick = function() {
        myImage.src = myTextbox.value;
    };
}

Ale nie chcę promować używania with. Prawdopodobnie jest na to lepszy sposób.


2

Cóż, możesz stworzyć skróconą funkcję, to właśnie robię.

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

a kiedy chciałeś to dostać, po prostu to robisz

$('yourid')

Kolejną przydatną sztuczką, którą znalazłem, jest to, że jeśli chcesz uzyskać wartość lub wewnętrzny kod HTML identyfikatora przedmiotu, możesz utworzyć takie funkcje:

function $val(el) {
    return $(el).value;
}

function $inner(el) {
    return $(el).innerHTML;
}

Mam nadzieję że ci się spodoba!

Właściwie stworzyłem coś w rodzaju mini biblioteki javascript opartej na tym pomyśle. Tutaj jest.


Właśnie ponownie spojrzałem na to pytanie i znalazłem to. Jest to całkiem fajna biblioteka, jeśli nie chcesz zawierać całej biblioteki jQuery.
Fox Wilson

2

Często używam:

var byId='getElementById'
var byClass='getElementsByClass'
var byTag='getElementsByTag'


var mydiv=document[byId]('div') 
/* as document["getElementById"] === document.getElementById */

Myślę, że to lepsze niż funkcja zewnętrzna (np. $()Lub byId()), ponieważ możesz robić takie rzeczy:

var link=document[byId]('list')[byClass]('li')[0][byTag]('a')[0]


Btw, nie używaj do tego jQuery, jQuery jest dużo, dużo wolniejszy niż document.getElementById()funkcja zewnętrzna, taka jak $()or byId(), lub moja metoda: http://jsperf.com/document-getelementbyid-vs-jquery/5


1

Jeśli jest to w Twojej witrynie, rozważ użycie biblioteki takiej jak jQuery aby uzyskać ten i wiele innych przydatnych skrótów, które również odejmują różnice między przeglądarkami. Osobiście, gdybym napisał wystarczająco dużo kodu, aby zawracać sobie głowę odręcznością, dodałbym jQuery.

W jQuery składnia byłaby taka $("#someid"). Jeśli chcesz mieć rzeczywisty element DOM, a nie opakowanie jQuery, to jest $("#someid")[0], ale najprawdopodobniej możesz zrobić wszystko, czego szukasz, z opakowaniem jQuery.

Lub, jeśli używasz tego w konsoli programisty przeglądarki, sprawdź ich wbudowane narzędzia. Jak ktoś wspomniał, konsola JavaScript w przeglądarce Chrome zawiera $("someid")metodę. Możesz także kliknąć element w widoku „Elementy” narzędzi programistycznych, a następnie odwołać się do niego z $0poziomu konsoli. Poprzednio wybrany element staje się $1i tak dalej.


1

Jeśli jedynym problemem jest tutaj pisanie, może powinieneś po prostu kupić sobie edytor JavaScript z inteligencją.

Jeśli celem jest uzyskanie krótszego kodu, możesz rozważyć bibliotekę JavaScript, taką jak jQuery, lub możesz po prostu napisać własne skrócone funkcje, takie jak:

function byId(string) {return document.getElementById(string);}

Robiłem to powyżej dla lepszej wydajności. W zeszłym roku nauczyłem się, że dzięki technikom kompresji serwer robi to automatycznie za Ciebie, więc moja technika skracania sprawiała, że ​​mój kod był cięższy. Teraz jestem zadowolony z wpisania całego document.getElementById.


1

Jeśli prosisz o skróconą funkcję ...

<!DOCTYPE html>
<html>

<body>
The content of the body element is displayed in your browser.
<div id="d1">DIV</div>
<script>
var d=document;
d.g=document.getElementById;
d.g("d1").innerHTML = "catch";
</script>
</body>

</html>

lub

<!DOCTYPE html>
<html>

<body>
The content of the body element is displayed in your browser.
<div id="d1">DIV</div>
<script>
var w=window;
w["d1"].innerHTML = "catch2";
</script>
</body>


1

Funkcja strzałek jest krótsza.

var $id = (id) => document.getElementById(id);

Możesz go jeszcze bardziej skrócić, usuwając nawiasy otaczające idargument.
Shaggy

1

wrap the document.querySelectorAll ... jquery jak select

function $(selector){
   var s = document.querySelectorAll(selector); 
   return s.length > 1 ? s : s[0];
}

// usage: $('$myId')

Och, ale wygląda na to, że ciężko się z tym pracuje. Funkcja może zwrócić undefined, HTMLElement lub NodeList. Oczywiście, gdy używasz go do pobierania elementu według jego identyfikatora $('#myId'), zwykle powinien on zwrócić ten element HTMLElement, ponieważ miejmy nadzieję, że przypisałeś ten identyfikator dokładnie raz. Ale jeśli użyjesz go do zapytań, które mogą pasować do wielu elementów, stanie się to kłopotliwe.
Robert

0

Cóż, jeśli id ​​elementu nie konkuruje z żadnymi właściwościami obiektu globalnego, nie musisz używać żadnej funkcji.

myDiv.appendChild(document.createTextNode("Once I was myDiv. "));
myDiv.id = "yourDiv";
yourDiv.appendChild(document.createTextNode("But now I'm yourDiv."));

edycja: ale nie chcesz korzystać z tej „funkcji”.


:( To brzmi dla mnie jak nadużycie przeglądarki. Pokaż mi, gdzie to jest poprawne w specyfikacji HTML5.
Raynos,

1
@Raynos: dev.w3.org/html5/spec/… Ale: „Możliwe, że to się zmieni. Dostawcy przeglądarek rozważają ograniczenie tego zachowania do trybu dziwactw”. Działa jednak w moim FF4 i IE8.
Robert

2
tak, teraz działa, ale wydaje się brudny i nie zdziwiłbym się, gdyby został wycofany do końca roku.
Raynos,

@Raynos Mam nadzieję, że tak. Nie lubię, gdy przeglądarki zanieczyszczają globalną przestrzeń nazw. Ale z drugiej strony nie było to takie złe, kiedy zostało wynalezione. (kiedy strony internetowe były skoncentrowane na html, a javascript był fajną funkcją)
Robert

0

Kolejne opakowanie:

const IDS = new Proxy({}, { 
    get: function(target, id) {
        return document.getElementById(id); } });

IDS.camelCaseId.style.color = 'red';
IDS['dash-id'].style.color = 'blue';
<div id="camelCaseId">div 1</div>
<div id="dash-id">div 2</div>

To na wypadek, gdybyś nie chciał używać rzeczy nie do pomyślenia , patrz powyżej.


0

Możesz użyć funkcji opakowania, takiej jak:

const byId = (id) => document.getElementById(id);

Lub

Przypisz document.getElementById do zmiennej, wiążąc ją z documentobiektem.

const byId = document.getElementById.bind(document);

Uwaga: w drugim podejściu, jeśli nie połączysz się document.getElementByIdz , pojawi documentsię błąd:

Uncaught TypeError: Illegal invocation

Co Function.bindrobi, to tworzy nową funkcję ze thissłowem kluczowym ustawionym na wartość, którą podajesz jako argument Function.bind.

Przeczytaj dokumentację dla Function.bind


-1

Napisałem to wczoraj i uznałem to za przydatne.

function gid(id, attribute) {
    var x = 'document.getElementById("'+id+'")';
    if(attribute) x += '.'+attribute;
    eval('x =' + x);
    return x;
}

Tak go używasz.

// Get element by ID
   var node = gid('someID'); //returns <p id='someID' class='style'>Hello World</p>

// returns 'Hello World'
// var getText = document.GetElementById('someID').innerText; 
   var getText = gid('someID', 'innerText'); 

// Get parent node
   var parentNode = gid('someID', 'parentNode');

To nie jest dobre użycie eval. Nie ma nic w uzyskaniu elementu, który potrzebuje wartości eval, a możesz dynamicznie uzyskać właściwość z notacją nawiasową. Zobacz developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
ThatsNoMoon
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.