Raccourci Javascript pour getElementById

93

Existe-t-il un raccourci pour le JavaScript document.getElementById? Ou est-ce que je peux en définir un? Il obtient refrappe répétitif que plus et plus .

Fox Wilson
la source
6
Je ne sais pas qui les a rejetés, mais quelqu'un qui ne connaît pas suffisamment Javascript pour ne pas savoir comment créer des raccourcis comme celui-ci risque également de rencontrer des problèmes lorsqu'il essaie de l'utiliser avec, par exemple, jQuery, et constate que la variable $ n'est pas cohérente. La bonne réponse est "Non, nativement Javascript ne propose pas de raccourci, mais il existe plusieurs frameworks qui facilitent la sélection des nœuds DOM."
kojiro le

Réponses:

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

$( 'someID' )

Ici, j'ai utilisé $, mais vous pouvez utiliser n'importe quel nom de variable valide.

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

byId( 'someID' )
utilisateur113716
la source
6
@patrick dw j'aime ça. Surtout avec la richesse de noms de variables valides là-bas :)
Fox Wilson
4
"avec la richesse de noms de variables valides" - voulez-vous dire "au moins deux grands frameworks JS utilisent déjà $, félicitations d'avoir choisi cela aussi?"
Piskvor a quitté le bâtiment le
47
Le nombre de bibliothèques utilisées ne fait aucune différence $si vous ne les chargez jamais.
user113716
7
Pour mémoire, j'avais l'habitude de le faire var $ = document.getElementById.bind(document), mais ce bindn'est pas disponible dans tous les navigateurs. C'est peut-être plus rapide, car je n'utilise que des méthodes natives. Je voulais juste ajouter ceci.
pimvdb
7
@Piskvor: Je ne code jamais pour accommoder l'ignorance. L'ignorance conduit à un code cassé. Un code cassé conduit à des recherches. La recherche mène à l'information. L'ignorance est guérie.
user113716
85

Pour enregistrer un caractère supplémentaire, vous pouvez polluer le prototype String comme ceci:

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

Cela fonctionne dans certains navigateurs et vous pouvez accéder aux éléments de cette façon:

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

J'ai choisi le nom de la propriété presque au hasard. Si vous vouliez réellement utiliser ce raccourci, je vous suggère de trouver quelque chose de plus facile à taper.

Robert
la source
12
绎 (Yì) - Unravel (chinois simplifié)
AnnanFay
8
Vous réalisez que cela a un impact raisonnable sur l'efficacité. Les getter / setters définis sur le prototype sont un ordre de grandeur plus lents.
Raynos
5
aussi, ce n'est peut-être qu'un seul caractère visible , mais cela prendra plus d'un octet dans le fichier ...
Alnitak
@Alnitak: oh oui, je n'y ai pas pensé. De plus, certaines personnes (comme moi) n'ont pas de touche 绎 sur leur clavier, elles passeraient donc beaucoup de temps à la copier-coller. Mais le nom n'est pas vraiment important. À l'origine, j'ai nommé la propriété «e» (comme l'élément) mais je pensais que ce nom pouvait déjà être revendiqué par une bibliothèque.
Robert
@Raynos: Oui, dans mon benchmark, c'est environ trois fois plus lent qu'une fonction normale. 0,4µs * 3 = 1,2µs
Robert
18

Vous pouvez facilement créer vous-même une sténographie:

function getE(id){
   return document.getElementById(id);
}
Sarfraz
la source
@Sarfraz Est-il préférable de le déclarer comme une variable ou une fonction? Cela a-t-il même une importance?
user1431627
@ user1431627: Si par variable vous vouliez dire expression de fonction, cela a de l'importance en termes de portée. La fonction publiée dans ma réponse sera disponible partout dans son contexte d'exécution. Voir: stackoverflow.com/questions/1013385/… ou kangax.github.io/nfe
Sarfraz
@Sarfraz Ok, merci :) jQuery gère cela dans une portée variable, non? La raison pour laquelle je pose la question est que la réponse principale a été écrite avec une portée variable, mais vous l'avez écrite comme une expression de fonction régulière.
user1431627
13

Une alternative rapide pour contribuer:

HTMLDocument.prototype.e = document.getElementById

Alors faites simplement:

document.e('id');

Il y a un hic, cela ne fonctionne pas dans les navigateurs qui ne vous permettent pas d'étendre les prototypes (par exemple IE6).

Pablo Fernandez
la source
2
@ walle1357: Cet article peut vous intéresser.
user113716
5
@ThiefMaster "Ne faites jamais X" est le pire des conseils que vous puissiez donner. Connaissez les alternatives, les avantages et les inconvénients, et choisissez la meilleure réponse pour chaque problème particulier. Il n'y a aucun mal à étendre le prototype dans ce cas (bien que je devrais dire que d'autres réponses conviennent mieux, celle-ci n'est laissée que pour l'achèvement)
Pablo Fernandez
Comment savez-vous que cela ne cassera rien dans certains navigateurs ou à l'avenir?
ThiefMaster
@PabloFernandez: Vous ne voulez toujours pas étendre les objets hôtes. Si au moins deux bibliothèques souhaitent étendre un objet hôte avec des propriétés de nom identique, seule la première bibliothèque prudente ou la dernière bibliothèque négligente réussira.
Robert
1
C'est clairement @ Robert pas la meilleure option, mais il est une option. Vous devez tenir compte des avantages et des inconvénients de chacun. Rappelez-vous que les bibliothèques javascript côté client ont commencé par prototype.jsfaire exactement la même chose.
Pablo Fernandez
8

(Raccourci pour non seulement obtenir élément par ID, mais aussi obtenir élément par classe: P)

J'utilise quelque chose comme

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

Utilisation: _(".test")retourne tous les éléments avec le nom de la classe testet _("#blah")retourne un élément avec l'id blah.

JiminP
la source
6
Vous feriez mieux de créer un raccourci pour document.querySelectorAll, au lieu d'essayer d'émuler une partie de la querySelectorAllméthode dans une fonction personnalisée.
Rob W
7
<script>
var _ = function(eId)
{
    return getElementById(eId);
}
</script>

<script>
var myDiv = _('id');
</script>
genèse
la source
7

les identifiants sont enregistrés dans le fichier window.

HTML

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

JS

logo.innerHTML;

équivaut à écrire:

document.getElementById( 'logo' ).innerHtml;

Je ne suggère pas d'utiliser l'ancienne méthode car ce n'est pas une pratique courante.

im_benton
la source
Pourriez-vous expliquer pourquoi vous ne suggérez pas d'utiliser cette méthode?
Okku
Je ne le vois jamais utilisé car je ne pense pas que ce soit une pratique de pari. Mais c'est le moyen le plus court de le trouver.
im_benton
@Okku car <div id="location"></div>et l'appel window.locationne fonctionnera pas.
Alex
6

Il y a plusieurs bonnes réponses ici et plusieurs dansent autour de la syntaxe de type jQuery, mais aucune ne mentionne réellement l'utilisation de jQuery. Si vous n'êtes pas contre l'essayer, consultez jQuery . Cela vous permet de sélectionner des éléments très facilement comme celui-ci.

Par ID :

$('#elementId')

Par classe CSS :

$('.className')

Par type d'élément :

$('a')  // all anchors on page 
$('inputs')  // all inputs on page 
$('p a')  // all anchors within paragaphs on page 
Kon
la source
3
J'ai essayé jQuery, mais ai-je vraiment besoin d'une bibliothèque entière juste pour un raccourci getElementById?
Fox Wilson
Quelle est la "syntaxe de type jQuery" dans les autres réponses? Pour la plupart, ce ne sont que de vieilles fonctions référencées par des variables. Il n'y a rien de semblable à jQuery à ce sujet. ; o)
user113716
3
@patrick dw, d'accord, votre réponse $ ('someID') ne ressemble en rien à un sélecteur d'ID jQuery $ ('# someID') :)
Kon
5

Il n'y a aucun intégré.

Si cela ne vous dérange pas de polluer l'espace de noms global, pourquoi pas:

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

EDIT - J'ai changé le nom de la fonction pour être quelque chose d' inhabituel , mais court et pas autrement en conflit avec jQuery ou toute autre chose qui utilise un $signe nu .

Alnitak
la source
3

Oui, il devient répétitif d'utiliser la même fonction encore et encore à chaque fois avec un argument différent:

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

Donc, une bonne chose serait une fonction qui prend tous ces arguments en même temps:

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

Ensuite, vous auriez des références à tous vos éléments stockés dans un seul objet:

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

Mais vous devrez tout de même répertorier tous ces identifiants.

Vous pouvez le simplifier encore plus si vous voulez tous les éléments avec des identifiants:

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

Mais il serait assez coûteux d'appeler cette fonction si vous avez de nombreux éléments.


Donc, théoriquement, si vous utilisiez le withmot - clé, vous pourriez écrire un code comme celui-ci:

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

Mais je ne veux pas promouvoir l'utilisation de with. Il existe probablement une meilleure façon de le faire.

Robert
la source
2

Eh bien, vous pouvez créer une fonction de raccourci, c'est ce que je fais.

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

Et puis quand tu voulais l'obtenir, tu fais juste

$('yourid')

De plus, une autre astuce utile que j'ai trouvée est que si vous voulez obtenir la valeur ou le innerHTML d'un ID d'élément, vous pouvez créer des fonctions comme celle-ci:

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

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

J'espère que vous aimez!

J'ai en fait créé une sorte de mini bibliothèque javascript basée sur toute cette idée. La voici .

user3385777
la source
Je regardais à nouveau cette question et je l'ai trouvée. C'est une bibliothèque assez soignée si vous ne voulez pas inclure tout jQuery.
Fox Wilson
2

J'utilise fréquemment:

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


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

Je pense que c'est mieux qu'une fonction externe (par exemple $()ou byId()) parce que vous pouvez faire des choses comme ça:

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


Btw, n'utilisez pas jQuery pour cela, jQuery est beaucoup, beaucoup plus lent qu'une document.getElementById()fonction externe comme $()ou byId(), ou ma méthode: http://jsperf.com/document-getelementbyid-vs-jquery/5

Gilles Castel
la source
1

Si cela se trouve sur votre propre site, envisagez d'utiliser une bibliothèque comme jQuery pour vous donner cela et de nombreux autres raccourcis utiles qui évitent également les différences de navigateur. Personnellement, si j'écrivais suffisamment de code pour être dérangé par le longhand, j'inclurais jQuery.

Dans jQuery, la syntaxe serait $("#someid"). Si vous voulez ensuite l'élément DOM réel et non le wrapper jQuery, c'est $("#someid")[0], mais vous pouvez très probablement faire ce que vous voulez avec le wrapper jQuery.

Ou, si vous l'utilisez dans une console de développeur de navigateur, recherchez leurs utilitaires intégrés. Comme quelqu'un d'autre l'a mentionné, la console Chrome JavaScript comprend une $("someid")méthode, et vous pouvez également cliquer sur un élément dans la vue "Éléments" des outils de développement, puis le référencer à $0partir de la console. L'élément précédemment sélectionné devient $1et ainsi de suite.

Henrik N
la source
1

Si le seul problème ici est la saisie, vous devriez peut-être vous procurer un éditeur JavaScript avec intellisense.

Si le but est d'obtenir un code plus court, vous pouvez envisager une bibliothèque JavaScript comme jQuery, ou vous pouvez simplement écrire vos propres fonctions abrégées, comme:

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

J'avais l'habitude de faire ce qui précède pour de meilleures performances. Ce que j'ai appris l'année dernière, c'est qu'avec les techniques de compression, le serveur le fait automatiquement pour vous, donc ma technique de raccourcissement alourdissait en fait mon code. Maintenant, je suis juste content de taper tout le document.getElementById.

Christophe
la source
1

Si vous demandez une fonction de raccourci ...

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

ou

<!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
la source
1

Les fonctions fléchées font est plus courte.

var $id = (id) => document.getElementById(id);
Wiktor
la source
Vous pouvez le raccourcir encore plus en supprimant les parenthèses entourant l' idargument.
Shaggy
1

envelopper le document.querySelectorAll ... une jquery comme select

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

// usage: $('$myId')

la source
Oh, mais cela semble un peu difficile à travailler. La fonction peut renvoyer undefined, un HTMLElement ou un NodeList. Bien sûr, lorsque vous l'utilisez pour obtenir un élément par son identifiant, $('#myId')il doit généralement renvoyer ce HTMLElement, car vous avez, espérons-le, attribué cet identifiant exactement une fois. Mais si vous l'utilisez avec des requêtes pouvant correspondre à plusieurs éléments, cela devient fastidieux.
Robert
0

Eh bien, si l'id de l'élément n'est en concurrence avec aucune propriété de l'objet global, vous ne devez utiliser aucune fonction.

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

edit: Mais vous ne voulez pas utiliser cette «fonctionnalité».

Robert
la source
:( Cela me semble être un abus de navigateur. Montrez-moi où cela est valide dans les spécifications HTML5.
Raynos
1
@Raynos: dev.w3.org/html5/spec/ ... Mais: "Il est possible que cela change. Les fournisseurs de navigateurs envisagent de limiter ce comportement au mode bizarreries." Fonctionne dans mon FF4 et IE8 cependant.
Robert
2
oui ça marche en ce moment mais ça se sent sale et je ne serais pas surpris si ça devenait obsolète d'ici la fin de l'année.
Raynos
@Raynos je l'espère. Je n'aime pas que les navigateurs polluent l'espace de noms global. Mais d'un autre côté, ce n'était pas une si mauvaise chose quand il a été inventé. (lorsque les pages Web étaient centrées sur le html et que javascript était une fonctionnalité intéressante)
Robert
0

Un autre emballage:

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>

Ceci, au cas où vous ne voudriez pas utiliser l' impensable , voyez ci-dessus.

Mike C.
la source
-1

J'ai écrit ceci hier et l'ai trouvé très utile.

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

Voici comment vous l'utilisez.

// 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
la source
Ce n'est pas une bonne utilisation de eval. Il n'y a rien sur l'obtention de l'élément qui nécessite eval, et vous pouvez obtenir dynamiquement une propriété avec une notation entre crochets. Voir developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
ThatsNoMoon