Abbreviazione Javascript per getElementById


93

Esiste una scorciatoia per JavaScript document.getElementById? O c'è un modo in cui posso definirne uno? Diventa ripetitivo riscrivendolo più e più volte .


6
Non so chi li abbia svalutati, ma qualcuno che non ha abbastanza familiarità con Javascript da non sapere come creare scorciatoie come questa rischia anche di incontrare problemi quando cerca di usarlo con, ad esempio, jQuery e lo trova la variabile $ non è coerente. La risposta corretta è "No, in modo nativo Javascript non offre una scorciatoia, ma esistono diversi framework che semplificano la selezione dei nodi DOM".
kojiro

Risposte:


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

$( 'someID' )

Qui ho usato $, ma puoi usare qualsiasi nome di variabile valido.

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

byId( 'someID' )

6
@patrick dw mi piace. Soprattutto con la ricchezza di nomi di variabili validi là fuori :)
Fox Wilson

4
"con la ricchezza di nomi di variabili validi" - intendi "almeno due importanti framework JS stanno già utilizzando $, congratulazioni per aver scelto anche quello?"
Piskvor ha lasciato l'edificio il

47
Non fa differenza quante librerie usano $se non le carichi mai.
user113716

7
Solo per la cronaca, lo facevo var $ = document.getElementById.bind(document), ma bindnon è disponibile in tutti i browser. Forse è più veloce, perché sto usando solo metodi nativi. Volevo solo aggiungere questo.
pimvdb

7
@Piskvor: non ho mai codice per soddisfare l'ignoranza. L'ignoranza porta al codice rotto. Il codice rotto porta alla ricerca. La ricerca porta all'informazione. L'ignoranza è guarita.
user113716

85

Per salvare un carattere in più potresti inquinare il prototipo String in questo modo:

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

Funziona in alcuni browser e puoi accedere agli elementi in questo modo:

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

Ho scelto il nome della proprietà quasi a caso. Se in realtà volessi usare questa scorciatoia, ti suggerirei di inventare qualcosa di più facile da digitare.


12
绎 (Yì) - Unravel (cinese semplificato)
AnnanFay

8
Ti rendi conto che questo richiede un ragionevole calo di efficienza. getter / setter definiti sul prototipo sono di un ordine di grandezza più lenti.
Raynos

5
inoltre, potrebbe essere solo un carattere visibile , ma ci vorrà più di un byte nel file ...
Alnitak,

@ Alnitak: oh giusto, non ci avevo pensato. Inoltre alcune persone (come me) non hanno un tasto 绎 sulle loro tastiere, quindi passerebbero molto tempo a copiarlo e incollarlo. Ma il nome non è molto importante. Inizialmente ho chiamato la proprietà 'e' (elemento simile) ma pensavo che questo nome potesse essere già rivendicato da qualche libreria.
Robert,

@ Raynos: Sì, nel mio benchmark è circa tre volte più lento di una normale funzione. 0,4 µs * 3 = 1,2 µs
Robert,

18

Puoi facilmente creare stenografia facilmente da solo:

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

@Sarfraz È meglio dichiararlo come una variabile o una funzione? Ha importanza?
user1431627

@ user1431627: Se per variabile intendevi espressione di funzione, allora ha importanza in termini di ambito. La funzione pubblicata nella mia risposta sarà disponibile ovunque nel suo contesto di esecuzione. Vedere: stackoverflow.com/questions/1013385/... o kangax.github.io/nfe
Sarfraz

@Sarfraz Ok, grazie :) jQuery gestisce questo in un ambito variabile, giusto? Il motivo per cui lo chiedo è perché la risposta principale è stata scritta con un ambito variabile, ma l'hai scritta come un'espressione di funzione regolare.
user1431627

13

Una rapida alternativa per contribuire:

HTMLDocument.prototype.e = document.getElementById

Quindi fai semplicemente:

document.e('id');

C'è un problema, non funziona nei browser che non ti permettono di estendere i prototipi (ad esempio IE6).


2
@ walle1357: Questo articolo potrebbe interessarti.
user113716

5
@ThiefMaster "Non fare mai X" è il peggior consiglio che puoi dare. Conosci le alternative, i pro ei contro e scegli la risposta migliore per ogni problema particolare. Non c'è nulla di male nell'estendere il prototipo in questo caso (anche se dovrei dire che altre risposte sono più adatte, questa è lasciata solo per il completamento)
Pablo Fernandez

Come fai a sapere che non si romperà nulla in alcun browser o in futuro?
ThiefMaster

@PabloFernandez: Non vuoi ancora estendere gli oggetti host. Se almeno due librerie desiderano estendere un oggetto host con proprietà denominate in modo identico, solo la prima libreria attenta o l'ultima libreria incurante avrà successo.
Robert,

1
@ Robert questa non è chiaramente l'opzione migliore, ma è un'opzione. Devi considerare i pro e i contro di ognuno. Ricorda che le librerie javascript lato client hanno iniziato con le prototype.jsquali hanno fatto esattamente la stessa cosa.
Pablo Fernandez

8

(Abbreviazione non solo per ottenere elementi per ID, ma anche per ottenere elementi per classe: P)

Uso qualcosa di simile

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

Utilizzo: _(".test")restituisce tutti gli elementi con il nome della classetest e _("#blah")restituisce un elemento con id blah.


6
Faresti meglio a creare una scorciatoia per document.querySelectorAll, invece di provare a emulare una parte del querySelectorAllmetodo in una funzione personalizzata.
Rob W

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

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

7

gli ID vengono salvati nel file window.

HTML

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

JS

logo.innerHTML;

è lo stesso che scrivere:

document.getElementById( 'logo' ).innerHtml;

Non suggerisco di utilizzare il primo metodo in quanto non è pratica comune.


Potresti approfondire il motivo per cui non suggeriresti di utilizzare questo metodo?
Okku

Non lo vedo mai usato perché non penso sia una pratica di scommessa. Ma è il modo più breve per trovarlo.
im_benton

@ Okku perché <div id="location"></div>e la chiamata window.locationnon funzionerà.
Alex

6

Ci sono molte buone risposte qui e molte stanno danzando sulla sintassi simile a jQuery, ma nessuna menziona effettivamente l'uso di jQuery. Se non sei contrario a provarlo, controlla jQuery . Ti consente di selezionare elementi super facili come questo ..

Per ID :

$('#elementId')

Per classe CSS :

$('.className')

Per tipo di elemento :

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

3
Ho provato jQuery, ma ho davvero bisogno di un'intera libreria solo per una scorciatoia getElementById?
Fox Wilson

Qual è la "sintassi simile a jQuery" nelle altre risposte? Per lo più sono solo semplici vecchie funzioni referenziate da variabili. Non c'è niente di simile a jQuery in questo. ; o)
user113716

3
@patrick dw, Giusto, la tua risposta $ ('someID') non assomiglia a un selettore ID jQuery $ ('# someID') :)
Kon

5

Non ce n'è integrato.

Se non ti dispiace inquinare lo spazio dei nomi globale, perché no:

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

MODIFICA - Ho cambiato il nome della funzione in qualcosa di insolito , ma breve e non in contrasto con jQuery o qualsiasi altra cosa che utilizza un $segno nudo .


3

Sì, diventa ripetitivo usare la stessa funzione più e più volte ogni volta con un argomento diverso:

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

Quindi una cosa carina sarebbe una funzione che accetta tutti quegli argomenti allo stesso tempo:

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

Quindi avresti riferimenti a tutti i tuoi elementi memorizzati in un oggetto:

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

Ma dovresti comunque elencare tutti quegli ID.

Potresti semplificarlo ancora di più se vuoi tutti gli elementi con ID:

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

Ma sarebbe piuttosto costoso chiamare questa funzione se hai molti elementi.


Quindi, in teoria, se utilizzassi la withparola chiave potresti scrivere codice come questo:

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

Ma non voglio promuovere l'uso di with. Probabilmente c'è un modo migliore per farlo.


2

Beh, potresti creare una funzione abbreviata, ecco cosa faccio.

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

e poi quando volevi averlo, lo fai e basta

$('yourid')

Inoltre, un altro trucco utile che ho trovato, è che se vuoi ottenere il valore o innerHTML di un ID articolo, puoi creare funzioni come questa:

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

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

Spero ti piaccia!

In realtà ho creato una sorta di mini libreria javascript basata su tutta questa idea. Eccolo qui .


Stavo solo guardando di nuovo questa domanda e l'ho trovata. Questa è una libreria piuttosto ordinata se non vuoi includere tutto jQuery.
Fox Wilson

2

Uso spesso:

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


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

Penso che sia meglio di una funzione esterna (ad esempio $()o byId()) perché puoi fare cose come questa:

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


A proposito, non usare jQuery per questo, jQuery è molto, molto più lento di document.getElementById()una funzione esterna come $()o byId(), o il mio metodo: http://jsperf.com/document-getelementbyid-vs-jquery/5


1

Se si trova sul tuo sito, considera l'utilizzo di una libreria come jQuery per darti questa e molte altre scorciatoie utili che astraggono anche le differenze del browser. Personalmente, se scrivessi abbastanza codice per essere infastidito dalla mano lunga, includerei jQuery.

In jQuery, la sintassi sarebbe $("#someid"). Se quindi vuoi l'elemento DOM effettivo e non il wrapper jQuery, lo è $("#someid")[0], ma molto probabilmente potresti fare quello che stai cercando con il wrapper jQuery.

Oppure, se lo stai utilizzando in una console per sviluppatori di browser, cerca le loro utilità integrate. Come menzionato da qualcun altro, la console JavaScript di Chrome include un $("someid")metodo e puoi anche fare clic su un elemento nella visualizzazione "Elementi" degli strumenti per sviluppatori e quindi fare riferimento ad esso $0dalla console. L'elemento selezionato in precedenza diventa $1e così via.


1

Se l'unico problema qui è la digitazione, forse dovresti procurarti un editor JavaScript con intellisense.

Se lo scopo è ottenere codice più breve, potresti prendere in considerazione una libreria JavaScript come jQuery, oppure puoi semplicemente scrivere le tue funzioni abbreviate, come:

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

Ho usato per fare quanto sopra per prestazioni migliori. Quello che ho imparato l'anno scorso è che con le tecniche di compressione il server lo fa automaticamente per te, quindi la mia tecnica di accorciamento stava effettivamente rendendo il mio codice più pesante. Ora sono solo felice di scrivere l'intero document.getElementById.


1

Se stai chiedendo una funzione abbreviata ...

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

o

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

Le funzioni della freccia fanno è più breve.

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

Potresti accorciarlo ulteriormente rimuovendo le parentesi che racchiudono l' idargomento.
Shaggy

1

avvolgere il document.querySelectorAll ... un jquery come select

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

// usage: $('$myId')

Oh, ma sembra un po 'difficile lavorarci. La funzione potrebbe restituire undefined, un HTMLElement o un NodeList. Ovviamente quando lo usi per ottenere un elemento dal suo id $('#myId'), di solito dovrebbe restituire quell'HTMLElement, perché si spera che tu abbia assegnato quell'id esattamente una volta. Ma se lo usi con query che potrebbero corrispondere a più elementi, diventa complicato.
Robert

0

Bene, se l'id dell'elemento non è in concorrenza con nessuna proprietà dell'oggetto globale, non devi usare nessuna funzione.

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

modifica: ma non vuoi usare questa "funzionalità".


:( Mi sembra un abuso del browser. Mostrami dove è valido nelle specifiche HTML5.
Raynos,

1
@ Raynos: dev.w3.org/html5/spec/… Ma: "È possibile che questo cambierà. I fornitori di browser stanno considerando di limitare questo comportamento alla modalità quirks." Funziona però nel mio FF4 e IE8.
Robert

2
sì, adesso funziona ma sembra sporco e non sarei sorpreso se fosse deprecato entro la fine dell'anno.
Raynos

@ Raynos, lo spero. Non mi piace che i browser inquinino lo spazio dei nomi globale. Ma d'altra parte non era poi così male quando è stato inventato. (quando le pagine web erano incentrate su html e javascript era una bella funzionalità)
Robert

0

Un altro 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>

Questo, nel caso tu non voglia usare l' impensabile , vedi sopra.


-1

L'ho scritto ieri e l'ho trovato abbastanza utile.

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

Ecco come lo usi.

// 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');

Questo non è un buon uso di eval. Non c'è nulla nell'ottenere l'elemento che necessita di eval e puoi ottenere dinamicamente una proprietà con la notazione tra parentesi. Vedi developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
ThatsNoMoon
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.