Abreviatura de JavaScript para getElementById

93

¿Hay alguna forma abreviada de JavaScript document.getElementById? ¿O hay alguna forma de que pueda definir uno? Se vuelve repetitivo volver a escribir eso una y otra vez .

Fox Wilson
fuente
6
No sé quién los rechazó, pero alguien que no esté lo suficientemente familiarizado con Javascript y no sepa cómo crear accesos directos como este también es probable que tenga problemas cuando intente usarlo con, digamos, jQuery, y descubra que la variable $ no es consistente. La respuesta correcta es "No, Javascript de forma nativa no ofrece una abreviatura, pero hay varios marcos que facilitan la selección de nodos DOM".
kojiro

Respuestas:

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

$( 'someID' )

Aquí usé $, pero puedes usar cualquier nombre de variable válido.

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

byId( 'someID' )
usuario113716
fuente
6
@patrick dw eso me gusta. Especialmente con la gran cantidad de nombres de variables válidos que existen :)
Fox Wilson
4
"con la gran cantidad de nombres de variables válidos", ¿quiere decir "al menos dos marcos JS principales ya están usando $, felicitaciones por elegir eso también?"
Piskvor salió del edificio el
47
No $importa cuántas bibliotecas se utilicen si nunca las carga.
user113716
7
Solo para que conste, solía hacerlo var $ = document.getElementById.bind(document), pero bindno está disponible en todos los navegadores. Sin embargo, quizás sea más rápido, porque solo estoy usando métodos nativos. Solo quería agregar esto.
pimvdb
7
@Piskvor: Nunca codifico para adaptarse a la ignorancia. La ignorancia conduce a un código roto. El código roto conduce a la investigación. La investigación conduce a la información. La ignorancia se cura.
user113716
85

Para guardar un personaje adicional, puede contaminar el prototipo String de esta manera:

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 en algunos navegadores y puede acceder a los elementos de esta manera:

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

He elegido el nombre de la propiedad casi al azar. Si realmente quisiera utilizar esta abreviatura, le sugiero que se le ocurra algo más fácil de escribir.

Robert
fuente
12
绎 (Yì) - Unravel (chino simplificado)
AnnanFay
8
Te das cuenta de que esto tiene un impacto razonable en la eficiencia. Los captadores / definidores definidos en el prototipo son un orden de magnitud más lentos.
Raynos
5
Además, es posible que solo sea un carácter visible , pero tomará más de un byte en el archivo ...
Alnitak
@Alnitak: claro, no he pensado en eso. Además, algunas personas (como yo) no tienen una tecla 绎 en sus teclados, por lo que dedicarían mucho tiempo a copiarla y pegarla. Pero el nombre no es realmente importante. Originalmente llamé a la propiedad 'e' (elemento similar) pero pensé que este nombre ya podría ser reclamado por alguna biblioteca.
Robert
@Raynos: Sí, en mi punto de referencia es aproximadamente tres veces más lento que una función normal. 0,4 µs * 3 = 1,2 µs
Robert
18

Puede crear taquigrafía fácilmente usted mismo:

function getE(id){
   return document.getElementById(id);
}
Sarfraz
fuente
@Sarfraz ¿Es mejor declararlo como variable o función? ¿Incluso importa?
user1431627
@ user1431627: Si por variable te refieres a la expresión de la función, entonces sí importa en términos de alcance. La función publicada en mi respuesta estará disponible en todas partes en su contexto de ejecución. Ver: stackoverflow.com/questions/1013385/… o kangax.github.io/nfe
Sarfraz
@Sarfraz Ok, gracias :) jQuery maneja esto en un ámbito variable, ¿verdad? La razón por la que pregunto es porque la respuesta principal se escribió con un alcance variable, pero la escribió como una expresión de función regular.
user1431627
13

Una alternativa rápida para contribuir:

HTMLDocument.prototype.e = document.getElementById

Entonces solo haz:

document.e('id');

Hay un problema, no funciona en navegadores que no le permiten extender prototipos (por ejemplo, IE6).

Pablo fernandez
fuente
2
@ walle1357: Este artículo puede interesarle.
user113716
5
@ThiefMaster "Nunca hagas X" es el peor consejo que puedes dar. Conozca las alternativas, los pros y los contras, y elija la mejor respuesta para cada problema en particular. No hay nada de malo en extender el prototipo en este caso (aunque debo decir que otras respuestas encajan mejor, esta solo queda para completar)
Pablo Fernandez
¿Cómo sabe que no romperá nada en algún navegador o en el futuro?
ThiefMaster
@PabloFernandez: Aún no desea extender los objetos de host. Si al menos dos bibliotecas desean extender un objeto host con propiedades con nombres idénticos, solo la primera biblioteca cuidadosa o la última biblioteca descuidada tendrá éxito.
Robert
1
@Robert, esta claramente no es la mejor opción, pero es una opción. Debe considerar los pros y los contras de cada uno. Recuerde que las bibliotecas de JavaScript del lado del cliente comenzaron con las prototype.jsque hicieron exactamente lo mismo.
Pablo Fernandez
8

(Abreviatura para no solo obtener elemento por ID, sino también obtener elemento por clase: P)

Yo 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")devuelve todos los elementos con nombre de clase testy _("#blah")devuelve un elemento con id blah.

JiminP
fuente
6
Será mejor que cree un atajo para document.querySelectorAll, en lugar de intentar emular una parte del querySelectorAllmétodo en una función personalizada.
Rob W
7
<script>
var _ = function(eId)
{
    return getElementById(eId);
}
</script>

<script>
var myDiv = _('id');
</script>
génesis
fuente
7

las identificaciones se guardan en el window.

HTML

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

JS

logo.innerHTML;

es lo mismo que escribir:

document.getElementById( 'logo' ).innerHtml;

No sugiero usar el método anterior ya que no es una práctica común.

im_benton
fuente
¿Podría explicar por qué no sugeriría utilizar este método?
Okku
No veo que se use nunca ya que no creo que sea una práctica de apuestas. Pero es la forma más corta de encontrarlo.
im_benton
@Okku porque <div id="location"></div>y las llamadas window.locationno funcionarán.
Alex
6

Hay varias buenas respuestas aquí y varias bailan alrededor de la sintaxis similar a jQuery, pero ninguna menciona el uso real de jQuery. Si no está en contra de probarlo, consulte jQuery . Te permite seleccionar elementos súper fácil como este ..

Por ID :

$('#elementId')

Por clase 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
fuente
3
Probé jQuery, pero ¿realmente necesito una biblioteca completa solo para una abreviatura getElementById?
Fox Wilson
¿Cuál es la "sintaxis similar a jQuery" en las otras respuestas? En su mayoría, son simplemente funciones antiguas a las que hacen referencia las variables. No hay nada exclusivamente parecido a jQuery en eso. ; o)
user113716
3
@patrick dw, Correcto, su respuesta $ ('someID') no se parece en nada a un selector de ID de jQuery $ ('# someID') :)
Kon
5

No hay ninguno incorporado.

Si no le importa contaminar el espacio de nombres global, ¿por qué no?

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

EDITAR: cambié el nombre de la función para que sea algo inusual , pero corto y que no entre en conflicto con jQuery o cualquier otra cosa que use un $signo simple .

Alnitak
fuente
3

Sí, se vuelve repetitivo usar la misma función una y otra vez cada vez con un argumento diferente:

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

Entonces, algo bueno sería una función que toma todos esos argumentos al mismo tiempo:

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

Entonces tendrías referencias a todos tus elementos almacenados en un objeto:

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

Pero aún tendría que enumerar todos esos identificadores.

Podría simplificarlo aún más si desea todos los elementos con identificadores:

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

Pero sería bastante caro llamar a esta función si tiene muchos elementos.


Entonces, teóricamente, si usara la withpalabra clave, podría escribir un código como este:

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

Pero no quiero promover el uso de with. Probablemente haya una mejor manera de hacerlo.

Robert
fuente
2

Bueno, podrías crear una función abreviada, eso es lo que hago.

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

y luego, cuando querías conseguirlo, lo hacías

$('yourid')

Además, otro truco útil que encontré es que si desea obtener el valor o el HTML interno de un ID de elemento, puede hacer funciones como esta:

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

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

¡Espero que te guste!

De hecho, hice una especie de mini biblioteca de JavaScript basada en toda esta idea. Aquí está.

usuario3385777
fuente
Estaba mirando esta pregunta de nuevo y encontré esto. Esta es una biblioteca bastante ordenada si no desea incluir todo jQuery.
Fox Wilson
2

Yo uso con frecuencia:

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


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

Creo que es mejor que una función externa (por ejemplo, $()o byId()) porque puedes hacer cosas como esta:

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


Por cierto, no use jQuery para esto, jQuery es mucho, mucho más lento que document.getElementById()una función externa como $()o byId(), o mi método: http://jsperf.com/document-getelementbyid-vs-jquery/5

Gilles Castel
fuente
1

Si está en su propio sitio, considere usar una biblioteca como jQuery para darle esta y muchas otras abreviaturas útiles que también abstraen las diferencias del navegador. Personalmente, si escribiera suficiente código para que me molestara la mano, incluiría jQuery.

En jQuery, la sintaxis sería $("#someid"). Si luego desea el elemento DOM real y no el contenedor jQuery, lo es $("#someid")[0], pero lo más probable es que pueda hacer lo que esté buscando con el contenedor jQuery.

O, si está usando esto en una consola de desarrollador de navegador, investigue sus utilidades integradas. Como alguien más mencionó, la consola de JavaScript de Chrome incluye un $("someid")método, y también puede hacer clic en un elemento en la vista "Elementos" de las herramientas para desarrolladores y luego hacer referencia a él $0desde la consola. El elemento seleccionado anteriormente se convierte en $1y así sucesivamente.

Henrik N
fuente
1

Si el único problema aquí es escribir, tal vez debería obtener un editor de JavaScript con intellisense.

Si el propósito es obtener un código más corto, entonces podría considerar una biblioteca JavaScript como jQuery, o simplemente puede escribir sus propias funciones abreviadas, como:

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

Solía ​​hacer lo anterior para un mejor rendimiento. Lo que aprendí el año pasado es que con las técnicas de compresión el servidor lo hace automáticamente por ti, por lo que mi técnica de acortamiento estaba haciendo que mi código fuera más pesado. Ahora estoy contento de escribir todo el documento.getElementById.

Christophe
fuente
1

Si está solicitando una función de taquigrafía ...

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

Lumic
fuente
1

Las funciones de flecha hacen que sea más corto.

var $id = (id) => document.getElementById(id);
wiktor
fuente
Puede acortarlo aún más eliminando los paréntesis que encierran el idargumento.
Shaggy
1

envuelve el document.querySelectorAll ... un jquery como select

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

// usage: $('$myId')

fuente
Oh, pero parece un poco difícil trabajar con esto. La función podría devolver undefined, un HTMLElement o un NodeList. Por supuesto, cuando lo usa para obtener un elemento por su id $('#myId'), generalmente debería devolver ese HTMLElement, porque con suerte asignó ese id exactamente una vez. Pero si lo usa con consultas que pueden coincidir con varios elementos, se vuelve engorroso.
Robert
0

Bueno, si la identificación del elemento no compite con ninguna propiedad del objeto global, no tiene que usar ninguna función.

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

editar: Pero no quieres hacer uso de esta 'función'.

Robert
fuente
:( Eso me suena a abuso del navegador. Muéstrame dónde es válido esto en la especificación HTML5.
Raynos
1
@Raynos: dev.w3.org/html5/spec/… Pero: "Es posible que esto cambie. Los proveedores de navegadores están considerando limitar este comportamiento al modo peculiar". Sin embargo, funciona en mi FF4 e IE8.
Robert
2
sí, funciona ahora mismo, pero se siente sucio y no me sorprendería que se desaproveche antes de fin de año.
Raynos
@Raynos Eso espero. No me gusta que los navegadores contaminen el espacio de nombres global. Pero, por otro lado, esto no fue tan malo cuando se inventó. (cuando las páginas web estaban centradas en html y javascript era una buena característica)
Robert
0

Otro envoltorio:

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>

Esto, en caso de que no quieras usar lo impensable , mira arriba.

Mike C.
fuente
-1

Escribí esto ayer y lo encontré bastante útil.

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

Así es como lo usas.

// 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
fuente
Este no es un buen uso de eval. No se trata de obtener el elemento que necesita eval, y puede obtener dinámicamente una propiedad con notación entre corchetes. Ver developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
ThatsNoMoon