Javascript Kurzform für getElementById

93

Gibt es eine Abkürzung für das JavaScript document.getElementById? Oder kann ich eine definieren? Es wird sich wiederholende Abtippen , dass über und über .

Fox Wilson
quelle
6
Ich weiß nicht, wer sie herabgestuft hat, aber jemand, der mit Javascript nicht so vertraut ist, dass er nicht weiß, wie man solche Verknüpfungen erstellt, wird wahrscheinlich auch auf Probleme stoßen, wenn er versucht, sie beispielsweise mit jQuery zu verwenden, und das findet Die Variable $ ist nicht konsistent. Die richtige Antwort lautet: "Nein, Javascript bietet nativ keine Abkürzung, aber es gibt verschiedene Frameworks, die die Auswahl von DOM-Knoten erleichtern."
Kojiro

Antworten:

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

$( 'someID' )

Hier habe ich verwendet $, aber Sie können jeden gültigen Variablennamen verwenden.

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

byId( 'someID' )
user113716
quelle
6
@patrick dw Das gefällt mir. Besonders mit der Fülle an gültigen Variablennamen da draußen :)
Fox Wilson
4
"Mit der Fülle gültiger Variablennamen" - meinen Sie damit "mindestens zwei wichtige JS-Frameworks werden bereits verwendet $, herzlichen Glückwunsch auch dazu?"
Piskvor verließ das Gebäude am
47
Es spielt keine Rolle, wie viele Bibliotheken verwendet werden, $wenn Sie sie nie laden.
user113716
7
Nur zur Veranschaulichung, ich habe es früher getan var $ = document.getElementById.bind(document), ist aber bindnicht in allen Browsern verfügbar. Vielleicht ist es aber schneller, weil ich nur native Methoden verwende. Ich wollte das nur hinzufügen.
Pimvdb
7
@Piskvor: Ich codiere nie, um Unwissenheit Rechnung zu tragen. Unwissenheit führt zu fehlerhaftem Code. Defekter Code führt zu Recherchen. Forschung führt zu Informationen. Unwissenheit ist geheilt.
user113716
85

Um ein zusätzliches Zeichen zu speichern, können Sie den String-Prototyp folgendermaßen verschmutzen:

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);
    }
}

Es funktioniert in einigen Browsern und Sie können auf folgende Weise auf Elemente zugreifen:

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

Ich habe den Namen der Immobilie fast zufällig gewählt. Wenn Sie diese Kurzform tatsächlich verwenden möchten, würde ich vorschlagen, etwas zu finden, das einfacher zu tippen ist.

Robert
quelle
12
绎 (Yì) - Enträtseln (vereinfachtes Chinesisch)
AnnanFay
8
Sie erkennen, dass dies einen angemessenen Effizienzverlust bedeutet. Auf dem Prototyp definierte Getter / Setter sind um eine Größenordnung langsamer.
Raynos
5
Auch, das ist vielleicht nur ein sichtbares Zeichen, aber es wird mehr als ein Byte in der Datei dauern ...
Alnitak
@Alnitak: Oh, richtig, daran habe ich nicht gedacht. Außerdem haben einige Leute (wie ich) keine 绎 -Taste auf ihren Tastaturen, so dass sie viel Zeit damit verbringen würden, sie zu kopieren und einzufügen. Aber der Name ist nicht wirklich wichtig. Ursprünglich habe ich die Eigenschaft 'e' (like element) genannt, aber ich dachte, dieser Name könnte bereits von einer Bibliothek beansprucht werden.
Robert
@ Raynos: Ja, in meinem Benchmark ist es ungefähr dreimal so langsam wie eine reguläre Funktion. 0,4 us * 3 = 1,2 us
Robert
18

Sie können leicht selbst eine Kurzschrift erstellen:

function getE(id){
   return document.getElementById(id);
}
Sarfraz
quelle
@Sarfraz Ist es am besten, es als Variable oder Funktion zu deklarieren? Ist es überhaupt wichtig?
user1431627
@ user1431627: Wenn Sie mit Variable Funktionsausdruck gemeint haben, ist dies in Bezug auf den Umfang von Bedeutung. Die in meiner Antwort veröffentlichte Funktion ist in ihrem Ausführungskontext überall verfügbar. Siehe: stackoverflow.com/questions/1013385/… oder kangax.github.io/nfe
Sarfraz
@Sarfraz Ok, danke :) jQuery behandelt dies in einem variablen Bereich, oder? Der Grund, warum ich frage, ist, dass die oberste Antwort mit einem variablen Bereich geschrieben wurde, aber Sie haben sie als regulären Funktionsausdruck geschrieben.
user1431627
13

Eine schnelle Alternative, um einen Beitrag zu leisten:

HTMLDocument.prototype.e = document.getElementById

Dann machen Sie einfach:

document.e('id');

Es gibt einen Haken, es funktioniert nicht in Browsern, mit denen Sie keine Prototypen erweitern können (z. B. IE6).

Pablo Fernandez
quelle
2
@ walle1357: Dieser Artikel könnte Sie interessieren.
user113716
5
@ThiefMaster "Mach niemals X" ist der schlechteste Rat, den du geben kannst. Kennen Sie die Alternativen, die Vor- und Nachteile und wählen Sie die beste Antwort für jedes einzelne Problem. Es schadet nicht, den Prototyp in diesem Fall zu erweitern (obwohl ich sagen sollte, dass andere Antworten besser passen, bleibt diese nur zur Vervollständigung übrig)
Pablo Fernandez
Woher weißt du, dass es in keinem Browser oder in der Zukunft etwas kaputt macht?
ThiefMaster
@PabloFernandez: Sie möchten Host-Objekte immer noch nicht erweitern. Wenn mindestens zwei Bibliotheken ein Hostobjekt mit identisch benannten Eigenschaften erweitern möchten, ist nur die erste sorgfältige Bibliothek oder die letzte unachtsame Bibliothek erfolgreich.
Robert
1
@ Robert Dies ist eindeutig nicht die beste Option, aber es ist eine Option. Sie müssen die Vor- und Nachteile jedes Einzelnen berücksichtigen. Denken Sie daran, dass clientseitige Javascript-Bibliotheken begannen, mit prototype.jsdenen genau dasselbe getan wurde.
Pablo Fernandez
8

(Abkürzung, um nicht nur das Element nach ID abzurufen, sondern auch das Element nach Klasse: P)

Ich benutze so etwas wie

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;
    }
}

Verwendung: _(".test")Gibt alle Elemente mit dem Klassennamen testund _("#blah")ein Element mit der ID zurück blah.

JiminP
quelle
6
Sie sollten eine Verknüpfung für erstellen document.querySelectorAll, anstatt zu versuchen, einen Teil der querySelectorAllMethode in einer benutzerdefinierten Funktion zu emulieren .
Rob W
7

IDs werden im gespeichert window.

HTML

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

JS

logo.innerHTML;

ist das gleiche wie schreiben:

document.getElementById( 'logo' ).innerHtml;

Ich schlage nicht vor, die erstere Methode zu verwenden, da dies nicht üblich ist.

im_benton
quelle
Könnten Sie näher erläutern, warum Sie diese Methode nicht vorschlagen würden?
Okku
Ich sehe es nie benutzt, da ich nicht denke, dass es Wettpraxis ist. Aber es ist der kürzeste Weg, es zu finden.
im_benton
@Okku weil <div id="location"></div>und anrufen window.locationwird nicht funktionieren.
Alex
6

Hier gibt es mehrere gute Antworten und einige tanzen um die jQuery-ähnliche Syntax, aber nicht eine erwähnt tatsächlich die Verwendung von jQuery. Wenn Sie nicht dagegen sind, probieren Sie jQuery aus . So können Sie ganz einfach Elemente auswählen.

Nach ID :

$('#elementId')

Nach CSS-Klasse :

$('.className')

Nach Elementtyp :

$('a')  // all anchors on page 
$('inputs')  // all inputs on page 
$('p a')  // all anchors within paragaphs on page 
Kon
quelle
3
Ich habe jQuery ausprobiert, aber brauche ich wirklich eine ganze Bibliothek nur für eine Kurzform getElementById?
Fox Wilson
Was ist die "jQuery-ähnliche Syntax" in den anderen Antworten? Meist handelt es sich nur um alte Funktionen, auf die durch Variablen verwiesen wird. Daran ist nichts Einzigartiges wie jQuery. ; o)
user113716
3
@patrick dw, Richtig, Ihre Antwort $ ('someID') sieht nicht wie ein jQuery ID Selector $ ('# someID') aus :)
Kon
6
<script>
var _ = function(eId)
{
    return getElementById(eId);
}
</script>

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

Es ist keine eingebaut.

Wenn es Ihnen nichts ausmacht, den globalen Namespace zu verschmutzen, warum nicht:

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

BEARBEITEN - Ich habe den Funktionsnamen in etwas Ungewöhnliches geändert , aber kurz und nicht in Konflikt mit jQuery oder etwas anderem, das ein nacktes $Zeichen verwendet.

Alnitak
quelle
3

Ja, es wird wiederholend die gleiche Funktion zu verwenden , über und über jedes Mal mit einem anderen Argumente:

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

Eine schöne Sache wäre also eine Funktion, die alle diese Argumente gleichzeitig akzeptiert:

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

Dann hätten Sie Verweise auf alle Ihre Elemente in einem Objekt gespeichert:

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

Aber Sie müssten immer noch alle diese IDs auflisten.

Sie können es noch weiter vereinfachen, wenn Sie alle Elemente mit IDs möchten :

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;
}

Es wäre jedoch ziemlich teuer, diese Funktion aufzurufen, wenn Sie viele Elemente haben.


Wenn Sie also theoretisch das withSchlüsselwort verwenden würden, könnten Sie Code wie folgt schreiben:

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

Aber ich möchte die Verwendung von nicht fördern with. Wahrscheinlich gibt es einen besseren Weg, dies zu tun.

Robert
quelle
2

Nun, Sie könnten eine Kurzfunktion erstellen, das ist was ich tue.

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

und dann, wenn Sie es bekommen wollten, tun Sie es einfach

$('yourid')

Ein weiterer nützlicher Trick, den ich gefunden habe, ist, dass Sie Funktionen wie die folgenden ausführen können, wenn Sie den Wert oder das innerHTML einer Element-ID abrufen möchten:

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

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

Hoffe du magst es!

Ich habe tatsächlich eine Art Mini-Javascript-Bibliothek erstellt, die auf dieser ganzen Idee basiert. Hier ist es.

user3385777
quelle
Ich habe mir diese Frage gerade noch einmal angesehen und sie gefunden. Dies ist eine hübsche Bibliothek, wenn Sie nicht alle jQuery-Dateien einschließen möchten.
Fox Wilson
2

Ich benutze häufig:

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


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

Ich denke, es ist besser als eine externe Funktion (zB $()oder byId()), weil Sie solche Dinge tun können:

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


Übrigens, verwenden Sie jQuery nicht dafür, jQuery ist viel, viel langsamer als document.getElementById()eine externe Funktion wie $()oder byId()oder meine Methode: http://jsperf.com/document-getelementbyid-vs-jquery/5

Gilles Castel
quelle
1

Wenn sich dies auf Ihrer eigenen Site befindet, sollten Sie eine Bibliothek wie jQuery verwenden , um diese und viele andere nützliche Abkürzungen zu erhalten, die auch Browserunterschiede beseitigen. Persönlich würde ich jQuery einschließen, wenn ich genug Code schreiben würde, um von der Langschrift gestört zu werden.

In jQuery wäre die Syntax $("#someid"). Wenn Sie dann das eigentliche DOM-Element und nicht den jQuery-Wrapper möchten, ist dies der Fall $("#someid")[0], aber Sie können höchstwahrscheinlich mit dem jQuery-Wrapper alles tun, was Sie suchen.

Wenn Sie dies in einer Browser-Entwicklerkonsole verwenden, informieren Sie sich über die integrierten Dienstprogramme. Wie bereits erwähnt, enthält die Chrome JavaScript-Konsole eine $("someid")Methode. Sie können auch in der Ansicht "Elemente" der Entwicklertools auf ein Element klicken und es dann $0über die Konsole referenzieren . Das zuvor ausgewählte Element wird $1und so weiter.

Henrik N.
quelle
1

Wenn das einzige Problem hier das Tippen ist, sollten Sie sich vielleicht einfach einen JavaScript-Editor mit Intellisense zulegen.

Wenn der Zweck darin besteht, kürzeren Code zu erhalten, können Sie eine JavaScript-Bibliothek wie jQuery in Betracht ziehen oder einfach Ihre eigenen Kurzfunktionen schreiben, z.

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

Ich habe das oben genannte getan, um eine bessere Leistung zu erzielen. Was ich letztes Jahr gelernt habe, ist, dass der Server es mit Komprimierungstechniken automatisch für Sie erledigt, sodass meine Verkürzungstechnik meinen Code tatsächlich schwerer machte. Jetzt bin ich nur noch glücklich mit der Eingabe des gesamten document.getElementById.

Christophe
quelle
1

Wenn Sie nach einer Kurzfunktion fragen ...

<!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>

oder

<!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>

Lumic
quelle
1

Pfeilfunktionen machen ist kürzer.

var $id = (id) => document.getElementById(id);
wiktor
quelle
Sie können es noch weiter verkürzen, indem Sie die Klammern entfernen, die das idArgument einschließen .
Shaggy
1

Wrap the document.querySelectorAll ... eine Abfrage wie select

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

// usage: $('$myId')

quelle
Oh, aber es sieht ein bisschen schwierig aus, damit zu arbeiten. Die Funktion kann entweder undefiniert, ein HTMLElement oder eine NodeList zurückgeben. Wenn Sie es verwenden, um ein Element anhand seiner ID $('#myId')abzurufen, sollte es normalerweise dieses HTMLElement zurückgeben, da Sie diese ID hoffentlich genau einmal zugewiesen haben. Wenn Sie es jedoch für Abfragen verwenden, die möglicherweise mit mehreren Elementen übereinstimmen, wird es umständlich.
Robert
0

Wenn die ID des Elements nicht mit den Eigenschaften des globalen Objekts konkurriert, müssen Sie keine Funktion verwenden.

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

edit: Aber du willst diese 'Funktion' nicht nutzen.

Robert
quelle
:( Das klingt für mich nach Browser-Missbrauch. Zeigen Sie mir, wo dies in der HTML5-Spezifikation gültig ist.
Raynos
1
@Raynos: dev.w3.org/html5/spec/… Aber: "Es ist möglich, dass sich dies ändert. Browser-Anbieter erwägen, dieses Verhalten auf den Mackenmodus zu beschränken." Funktioniert aber in meinem FF4 und IE8.
Robert
2
Ja, es funktioniert gerade, aber es fühlt sich schmutzig an und ich wäre nicht überrascht, wenn es bis Ende des Jahres veraltet wäre.
Raynos
@ Raynos Ich hoffe es. Ich mag es nicht, wenn Browser den globalen Namespace verschmutzen. Andererseits war dies keine so schlechte Sache, als es erfunden wurde. (Wenn Webseiten HTML-zentriert waren und Javascript eine nette Funktion war)
Robert
0

Ein weiterer Wrapper:

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>

Dies, falls Sie das Undenkbare nicht verwenden möchten , siehe oben.

Mike C.
quelle
-1

Ich habe das gestern geschrieben und fand es ziemlich nützlich.

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

So verwenden Sie es.

// 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');
Born2die007
quelle
Dies ist keine gute Verwendung von eval. Es gibt nichts über das Abrufen des Elements, das ausgewertet werden muss, und Sie können dynamisch eine Eigenschaft mit Klammernotation abrufen. Siehe developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
ThatsNoMoon