Abreviação de Javascript para getElementById

93

Existe alguma forma abreviada para o JavaScript document.getElementById? Ou existe alguma maneira de definir um? Fica redigitação repetitivo que mais e mais .

Fox Wilson
fonte
6
Eu não sei quem votou contra eles, mas alguém que não está familiarizado com Javascript o suficiente para não saber como criar atalhos como este também pode ter problemas quando tentar usá-lo com, digamos, jQuery, e descobrir que a variável $ não é consistente. A resposta correta é "Não, nativamente o Javascript não oferece uma abreviatura, mas existem várias estruturas que tornam a seleção de nós DOM mais fácil."
kojiro

Respostas:

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

$( 'someID' )

Aqui eu usei $, mas você pode usar qualquer nome de variável válido.

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

byId( 'someID' )
user113716
fonte
6
@patrick dw eu gosto disso. Especialmente com a abundância de nomes de variáveis ​​válidos por aí :)
Fox Wilson
4
"com a abundância de nomes de variáveis ​​válidos" - você quer dizer "pelo menos duas estruturas JS principais já estão usando $, parabéns por escolher isso também?"
Piskvor saiu do prédio
47
Não faz diferença quantas bibliotecas usam $se você nunca as carrega.
user113716
7
Só para constar, eu costumava fazer var $ = document.getElementById.bind(document), mas bindnão está disponível em todos os navegadores. Talvez seja mais rápido, porque estou usando apenas métodos nativos. Só queria adicionar isso.
pimvdb
7
@Piskvor: Eu nunca codifico para acomodar a ignorância. Ignorância leva a código quebrado. Código quebrado leva à pesquisa. A pesquisa leva à informação. A ignorância está curada.
user113716
85

Para salvar um caractere extra, você pode poluir o protótipo String assim:

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

Funciona em alguns navegadores e você pode acessar os elementos da seguinte maneira:

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

Escolhi o nome da propriedade quase ao acaso. Se você realmente quiser usar esta abreviação, sugiro algo mais fácil de digitar.

Robert
fonte
12
绎 (Yì) - Unravel (chinês simplificado)
AnnanFay
8
Você percebe que isso exige um impacto razoável em termos de eficiência. getter / setters definidos no protótipo são uma ordem de magnitude mais lentos.
Raynos de
5
além disso, pode ser apenas um caractere visível , mas levará mais de um byte no arquivo ...
Alnitak
@Alnitak: ah, certo, não pensei nisso. Além disso, algumas pessoas (como eu) não têm uma tecla 绎 em seus teclados, então gastariam muito tempo copiando e colando. Mas o nome não é realmente importante. Originalmente, chamei a propriedade 'e' (como elemento), mas pensei que esse nome já pudesse ser reivindicado por alguma biblioteca.
Robert de
@Raynos: Sim, no meu benchmark é cerca de três vezes mais lento do que uma função normal. 0,4µs * 3 = 1,2µs
Robert de
18

Você pode criar abreviações facilmente:

function getE(id){
   return document.getElementById(id);
}
Sarfraz
fonte
@Sarfraz É melhor declará-lo como uma variável ou uma função? Isso importa mesmo?
user1431627
@ user1431627: Se por variável você quis dizer expressão de função, isso importa em termos de escopo. A função postada em minha resposta estará disponível em todo o contexto de execução. Consulte: stackoverflow.com/questions/1013385/… ou kangax.github.io/nfe
Sarfraz
@Sarfraz Ok, obrigado :) jQuery lida com isso em um escopo variável, certo? Estou perguntando porque a primeira resposta foi escrita com um escopo variável, mas você a escreveu como uma expressão de função regular.
user1431627
13

Uma alternativa rápida para contribuir:

HTMLDocument.prototype.e = document.getElementById

Depois é só fazer:

document.e('id');

Há um problema, ele não funciona em navegadores que não permitem estender protótipos (por exemplo, IE6).

Pablo Fernandez
fonte
2
@ walle1357: Este artigo pode ser do seu interesse.
user113716
5
@ThiefMaster "Nunca faça X" é o pior conselho que você pode dar. Conheça as alternativas, os prós e os contras e escolha a melhor resposta para cada problema específico. Não há mal nenhum em estender o protótipo neste caso (embora eu deva dizer que outras respostas são mais adequadas, esta é deixada apenas para ser concluída)
Pablo Fernandez
Como você sabe que não vai quebrar nada em algum navegador ou no futuro?
ThiefMaster de
@PabloFernandez: Você ainda não quer estender objetos hospedeiros. Se pelo menos duas bibliotecas quiserem estender um objeto host com propriedades nomeadas de forma idêntica, apenas a primeira biblioteca cuidadosa ou a última biblioteca descuidada terá sucesso.
Robert
1
@Robert esta claramente não é a melhor opção, mas é uma opção. Você precisa considerar os prós e os contras de cada um. Lembre-se de que as bibliotecas javascript do lado do cliente começaram com as prototype.jsquais faziam exatamente a mesma coisa.
Pablo Fernandez
8

(Abreviação para não apenas obter elemento por ID, mas também obter elemento por classe: P)

Eu uso algo como

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

Uso: _(".test")retorna todos os elementos com nome de classe teste _("#blah")retorna um elemento com id blah.

JiminP
fonte
6
É melhor criar um atalho para document.querySelectorAll, em vez de tentar emular uma parte do querySelectorAllmétodo em uma função personalizada.
Rob W
7
<script>
var _ = function(eId)
{
    return getElementById(eId);
}
</script>

<script>
var myDiv = _('id');
</script>
gênese
fonte
7

IDs são salvos no window.

HTML

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

JS

logo.innerHTML;

é o mesmo que escrever:

document.getElementById( 'logo' ).innerHtml;

Não sugiro usar o método anterior, pois não é uma prática comum.

im_benton
fonte
Você poderia explicar por que não sugeriu o uso desse método?
Okku
Eu não vejo isso usado nunca porque eu não acho que seja prática de aposta. Mas é o caminho mais curto para encontrá-lo.
im_benton
@Okku porque <div id="location"></div>e chamar window.locationnão vai funcionar.
Alex
6

Existem várias respostas boas aqui e várias estão dançando em torno da sintaxe semelhante à jQuery, mas nenhuma menciona realmente usar jQuery. Se você não é contra tentar, verifique o jQuery . Ele permite que você selecione elementos muito fáceis como este ..

Por ID :

$('#elementId')

Por classe CSS :

$('.className')

Por tipo de elemento :

$('a')  // all anchors on page 
$('inputs')  // all inputs on page 
$('p a')  // all anchors within paragaphs on page 
Kon
fonte
3
Eu tentei jQuery, mas eu realmente preciso de uma biblioteca inteira apenas para uma abreviação getElementById?
Fox Wilson de
Qual é a "sintaxe semelhante a jQuery" nas outras respostas? Na maioria das vezes, são apenas funções antigas referenciadas por variáveis. Não há nada exclusivamente parecido com jQuery nisso. ; o)
user113716
3
@patrick dw, Certo, sua resposta $ ('someID') não se parece em nada com um seletor de ID do jQuery $ ('# someID') :)
Kon
5

Não há nenhum embutido.

Se você não se importa em poluir o namespace global, por que não:

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

EDITAR - mudei o nome da função para algo incomum , mas curto e não colidindo com jQuery ou qualquer outra coisa que usa um $sinal simples .

Alnitak
fonte
3

Sim, ele fica repetitivo usar a mesma função mais e mais cada vez com um argumento diferente:

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

Então, uma coisa boa seria uma função que recebe todos esses argumentos ao mesmo 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;
}

Então você teria referências a todos os seus elementos armazenados em um objeto:

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

Mas você ainda teria que listar todos esses ids.

Você poderia simplificar ainda mais se quiser todos os elementos com ids:

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

Mas seria muito caro chamar essa função se você tiver muitos elementos.


Então, teoricamente, se você usasse a withpalavra-chave, você poderia escrever um código como este:

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

Mas não quero promover o uso de with. Provavelmente existe uma maneira melhor de fazer isso.

Robert
fonte
2

Bem, você poderia criar uma função abreviada, é o que eu faço.

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

e então, quando você quiser obtê-lo, basta fazer

$('yourid')

Além disso, outro truque útil que descobri é que se você deseja obter o valor ou innerHTML de um ID de item, pode fazer funções como estas:

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

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

Espero que você goste!

Na verdade, fiz uma espécie de mini biblioteca javascript com base nessa ideia. Aqui está.

user3385777
fonte
Eu estava apenas olhando para esta questão novamente e descobri isso. Esta é uma biblioteca muito legal se você não quiser incluir todo o jQuery.
Fox Wilson
2

Eu freqüentemente uso:

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


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

Acho que é melhor do que uma função externa (por exemplo, $()ou byId()) porque você pode fazer coisas assim:

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


A propósito, não use jQuery para isso, jQuery é muito, muito mais lento do que document.getElementById()uma função externa como $()ou byId(), ou meu método: http://jsperf.com/document-getelementbyid-vs-jquery/5

Gilles Castel
fonte
1

Se estiver em seu próprio site, considere usar uma biblioteca como a jQuery para fornecer este e muitos outros atalhos úteis que também abstraem as diferenças do navegador. Pessoalmente, se eu escrevesse código suficiente para ser incomodado por manuscritos, incluiria o jQuery.

Em jQuery, a sintaxe seria $("#someid"). Se você quiser o elemento DOM real e não o wrapper jQuery, é $("#someid")[0], mas provavelmente você pode fazer o que quiser com o wrapper jQuery.

Ou, se você estiver usando isso em um console de desenvolvedor de navegador, pesquise seus utilitários integrados. Como outra pessoa mencionou, o console JavaScript do Chrome inclui um $("someid")método, e você também pode clicar em um elemento na visualização "Elementos" das ferramentas do desenvolvedor e fazer referência a ele $0no console. O elemento selecionado anteriormente se torna $1e assim por diante.

Henrik N
fonte
1

Se o único problema aqui for digitar, talvez você deva apenas conseguir um editor de JavaScript com intellisense.

Se o objetivo é obter um código mais curto, você pode considerar uma biblioteca JavaScript como jQuery, ou pode apenas escrever suas próprias funções abreviadas, como:

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

Eu costumava fazer o acima para melhor desempenho. O que aprendi no ano passado é que, com as técnicas de compactação, o servidor faz isso automaticamente para você, então minha técnica de encurtamento estava na verdade tornando meu código mais pesado. Agora estou muito feliz em digitar todo o document.getElementById.

Christophe
fonte
1

Se você está pedindo uma função abreviada ...

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

As funções da seta são mais curtas.

var $id = (id) => document.getElementById(id);
wiktor
fonte
Você pode encurtá-lo ainda mais removendo os parênteses que envolvem o idargumento.
Shaggy
1

envolva o document.querySelectorAll ... um jquery como select

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

// usage: $('$myId')

fonte
Oh, mas isso parece um pouco difícil de trabalhar. A função pode retornar indefinido, um HTMLElement ou um NodeList. Claro, quando você o usa para obter um elemento por seu id $('#myId'), ele normalmente deve retornar esse HTMLElement, porque você provavelmente atribuiu esse id exatamente uma vez. Mas se você o usasse com consultas que podem corresponder a vários elementos, ele se tornaria complicado.
Robert
0

Bem, se o id do elemento não compete com nenhuma propriedade do objeto global, você não precisa usar nenhuma função.

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

editar: Mas você não quer fazer uso deste 'recurso'.

Robert
fonte
:( Isso soa como abuso do navegador para mim. Mostre-me onde isso é válido nas especificações do HTML5.
Raynos
1
@Raynos: dev.w3.org/html5/spec/… Mas: "É possível que isso mude. Os fornecedores de navegadores estão considerando limitar esse comportamento ao modo peculiares." Funciona no meu FF4 e IE8 embora.
Robert de
2
sim, funciona agora, mas parece sujo e eu não ficaria surpreso se fosse descontinuado até o final do ano.
Raynos
@Raynos espero que sim. Não gosto que os navegadores poluam o namespace global. Mas, por outro lado, isso não era tão ruim quando foi inventado. (quando as páginas da web eram centradas em html e javascript era um bom recurso)
Robert
0

Outro invólucro:

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>

Isso, caso você não queira usar o impensável , veja acima.

Mike C.
fonte
-1

Escrevi isso ontem e achei muito útil.

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

É assim que você o usa.

// 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
fonte
Este não é um bom uso de eval. Não há nada sobre obter o elemento que precisa de avaliação, e você pode obter dinamicamente uma propriedade com notação de colchetes. Consulte developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
ThatsNoMoon