GetElementById için Javascript Shorthand


94

JavaScript document.getElementById için herhangi bir kısaltma var mı? Yoksa birini tanımlayabilmemin bir yolu var mı? O tekrarlayan tekrar yazmanızı alır üzerinde ve aşırı .


6
Onlara kimin olumsuz oy verdiğini bilmiyorum, ancak Javascript'e yeterince aşina olmayan ve bunun gibi kısayolların nasıl oluşturulacağını bilmeyen biri, örneğin jQuery ile kullanmayı denediğinde sorunlara çarpabilir ve bunu bulur. $ değişkeni tutarlı değil. Doğru cevap "Hayır, yerel olarak Javascript bir kısaltma sunmuyor, ancak DOM düğümlerini seçmeyi kolaylaştıran birkaç çerçeve var."
kojiro

Yanıtlar:


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

$( 'someID' )

Burada kullandım $, ancak geçerli herhangi bir değişken adını kullanabilirsiniz.

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

byId( 'someID' )

6
@patrick dw Bunu beğendim. Özellikle geçerli değişken isimlerinin zenginliği ile :)
Fox Wilson

4
"geçerli değişken adlarının zenginliğiyle" - "en az iki büyük JS çerçevesi zaten kullanıyor $, bunu da seçtiğiniz için tebrikler " mi demek istiyorsunuz ?
Piskvor,

49
Hiçbir $zaman yüklemediğiniz takdirde kaç kitaplığın kullanıldığı fark etmez.
user113716

7
Sadece kayıt için, eskiden yapardım var $ = document.getElementById.bind(document), ancak bindtüm tarayıcılarda mevcut değil. Belki de daha hızlıdır, çünkü sadece yerel yöntemler kullanıyorum. Sadece bunu eklemek istedim.
pimvdb

7
@Piskvor: Cehaleti barındırmak için asla kod yazmam. Cehalet bozuk kodlara yol açar. Bozuk kod araştırmaya götürür. Araştırma bilgiye götürür. Cehalet tedavi edilir.
user113716

85

Fazladan bir karakter kaydetmek için String prototipini şu şekilde kirletebilirsiniz:

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

Bazı tarayıcılarda çalışır ve öğelere şu şekilde erişebilirsiniz:

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

Mülkün adını neredeyse rastgele seçtim. Bu kısaltmayı gerçekten kullanmak istiyorsanız, yazması daha kolay bir şey bulmanızı öneririm.


12
绎 (Yì) - Çöz (Basitleştirilmiş Çince)
AnnanFay

8
Bunun verimlilikte makul bir darbe aldığının farkındasınız. prototip üzerinde tanımlanan alıcı / ayarlayıcılar, daha yavaş bir sıradır.
Raynos

5
ayrıca, bu yalnızca bir görünür karakter olabilir, ancak dosyada birden fazla bayt alacak ...
Alnitak

@Alnitak: oh doğru, bunu düşünmedim. Dahası bazı kişilerin (benim gibi) klavyelerinde 绎 tuşu yoktur, bu yüzden onu kopyalayıp yapıştırmak için çok zaman harcarlar. Ama isim gerçekten önemli değil. Başlangıçta özelliğe 'e' (öğe gibi) adını verdim, ancak bu adın zaten bazı kütüphaneler tarafından talep edilebileceğini düşündüm.
Robert

@Raynos: Evet, benim kıyaslamama göre normal bir fonksiyondan yaklaşık üç kat daha yavaş. 0.4µs ​​* 3 = 1.2µs
Robert

18

Kendiniz kolayca steno oluşturabilirsiniz:

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

@Sarfraz Bunu bir değişken veya fonksiyon olarak ilan etmek en iyisi mi? Fark eder mi?
user1431627

@ user1431627: Değişkenle işlev ifadesini kastetmişseniz, kapsam açısından önemlidir. Cevabımda yayınlanan işlev, yürütme bağlamında her yerde mevcut olacaktır. Bakınız: stackoverflow.com/questions/1013385/… veya kangax.github.io/nfe
Sarfraz

@Sarfraz Tamam, teşekkürler :) jQuery bunu değişken bir kapsamda ele alıyor, değil mi? Sormamın nedeni, en üstteki cevabın değişken kapsam ile yazılmış olması, ancak bunu normal bir fonksiyon ifadesi olarak yazmış olmanız.
user1431627

13

Katkıda bulunmak için hızlı bir alternatif:

HTMLDocument.prototype.e = document.getElementById

O zaman yap:

document.e('id');

Bir yakalama var, prototipleri genişletmenize izin vermeyen tarayıcılarda çalışmıyor (örneğin IE6).


2
@ walle1357: Bu makale ilginizi çekebilir.
user113716

5
@ThiefMaster "Asla X yapma" verebileceğiniz en kötü tavsiye hakkındadır. Alternatifleri, artıları ve eksileri bilin ve her sorun için en iyi yanıtı seçin. Bu durumda prototip uzanan bir zarar yoktur (ı diğer cevaplar, daha iyi bir uyum olduğunu söylemek gerekir rağmen, bu sadece tamamlanması için bırakılır)
Pablo Fernandez

Bazı tarayıcılarda veya gelecekte hiçbir şeyi bozmayacağını nereden biliyorsunuz?
ThiefMaster

@PabloFernandez: Hala ana nesneleri genişletmek istemiyorsunuz. En az iki kitaplık aynı adlandırılmış özelliklere sahip bir ana bilgisayar nesnesini genişletmek isterse, yalnızca ilk dikkatli kitaplık veya son dikkatsiz kitaplık başarılı olacaktır.
Robert

1
Bu açıkça en iyi seçenek değildir, ama @Robert olan bir seçenek. Her birinin artılarını ve eksilerini göz önünde bulundurmanız gerekir. İstemci tarafı javascript kitaplıklarının tam olarak aynı şeyi prototype.jsyapan ile başladığını unutmayın .
Pablo Fernandez

8

(Yalnızca kimliğe göre öğe almak için değil, aynı zamanda sınıfa göre öğe almak için de kısaltma: P)

Gibi bir şey kullanıyorum

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

Kullanımı: _(".test")sınıf adıyla tüm unsurları döndürür testve _("#blah")kimliğine sahip bir öğe döndürür blah.


6
Özel bir işlevde yöntemin document.querySelectorAllbir bölümünü taklit etmeye çalışmak yerine, için bir kısayol oluştursanız iyi olur querySelectorAll.
Rob W

8

id'ler window.

HTML

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

JS

logo.innerHTML;

yazmakla aynıdır:

document.getElementById( 'logo' ).innerHtml;

Yaygın bir uygulama olmadığı için eski yöntemi kullanmanızı önermiyorum.


Bu yöntemi kullanmayı neden önermediğinizi açıklayabilir misiniz?
Okku

Bunun bahis çalışması olduğunu düşünmediğim için hiç kullanıldığını görmüyorum. Ama onu bulmanın en kısa yolu bu.
im_benton

@ Okku çünkü <div id="location"></div>ve arama window.locationçalışmayacak.
Alex

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

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

6

Burada birkaç iyi cevap var ve birkaçı jQuery benzeri sözdizimi etrafında dans ediyor, ancak gerçekte jQuery kullananlardan bahsedilmiyor. Denemeye karşı değilseniz, jQuery'ye bakın . Bunun gibi süper kolay öğeler seçmenize izin verir ..

Kimliğe göre :

$('#elementId')

CSS sınıfına göre :

$('.className')

Öğe türüne göre :

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

3
JQuery'yi denedim, ancak bir getElementById kısaltması için gerçekten bütün bir kitaplığa ihtiyacım var mı?
Fox Wilson

Nedir "jQuery gibi sözdizimi" diğer yanıtlar? Çoğunlukla değişkenler tarafından referans verilen basit eski işlevlerdir. Bunda benzersiz jQuery benzeri bir şey yok. ; o)
user113716

3
@patrick dw, Doğru, cevabınız $ ('someID') jQuery ID seçiciye hiç benzemiyor $ ('# someID') :)
Kon

5

Yerleşik hiçbiri yok.

Küresel ad alanını kirletmeyi düşünmüyorsanız, neden olmasın:

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

DÜZENLE - İşlev adını alışılmadık bir şey olacak şekilde değiştirdim , ancak kısa ve başka şekilde jQuery veya çıplak $işaret kullanan herhangi bir şeyle çakışmayacak .


3

Evet, aynı işlevi kullanmak tekrarlayan alır üzerinde ve üzerinde farklı bir argüman her zaman:

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

Bu nedenle, tüm bu argümanları aynı anda alan bir işlev güzel bir şey olabilir:

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

Ardından, tek bir nesnede depolanan tüm öğelerinize referanslarınız olur:

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

Ama yine de tüm bu kimlikleri listelemeniz gerekir.

Kimlikleri olan tüm öğeleri istiyorsanız bunu daha da basitleştirebilirsiniz :

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

Ancak birçok öğeniz varsa, bu işlevi çağırmak oldukça pahalı olacaktır.


Yani teorik olarak, withanahtar kelimeyi kullanırsanız şu şekilde kod yazabilirsiniz:

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

Ama kullanımını teşvik etmek istemiyorum with. Muhtemelen bunu yapmanın daha iyi bir yolu vardır.


2

Bir steno işlevi yaratabilirsiniz, ben de öyle yapıyorum.

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

ve sonra onu almak istediğinde, sadece yaparsın

$('yourid')

Ayrıca, bulduğum başka bir kullanışlı numara da, bir öğe kimliğinin değerini veya innerHTML'sini almak istiyorsanız, aşağıdaki gibi işlevler yapabilmenizdir:

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

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

Umarım beğenirsin!

Aslında tüm bu fikirden yola çıkarak bir tür mini javascript kitaplığı yaptım. İşte burada .


Bu soruya tekrar bakıyordum ve bunu buldum. Tüm jQuery'yi dahil etmek istemiyorsanız, bu oldukça temiz bir kitaplıktır.
Fox Wilson

2

Sık kullanıyorum:

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


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

Bunun harici bir işlevden daha iyi olduğunu düşünüyorum (örneğin $()veya byId()), çünkü aşağıdaki gibi şeyler yapabilirsiniz:

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


Btw, bunun için jQuery kullanmayın, jQuery çok daha yavaştır daha document.getElementById()gibi harici bir fonksiyon $()ya byId(), ya da benim yöntemi: http://jsperf.com/document-getelementbyid-vs-jquery/5


1

Bu kendi sitenizdeyse, size bunu ve tarayıcı farklılıklarını ortadan kaldıran diğer birçok yararlı kısayolu vermek için jQuery gibi bir kitaplık kullanmayı düşünün . Şahsen, elimden rahatsız olacak kadar kod yazarsam, jQuery'yi eklerdim.

JQuery'de sözdizimi olacaktır $("#someid"). Daha sonra jQuery sarmalayıcısını değil de gerçek DOM öğesini istiyorsanız, bu $("#someid")[0], ancak büyük olasılıkla jQuery sarmalayıcısıyla peşinde olduğunuz her şeyi yapabilirsiniz.

Veya bunu bir tarayıcı geliştirici konsolunda kullanıyorsanız, yerleşik yardımcı programlarını araştırın. Başka birinin bahsettiği gibi, Chrome JavaScript konsolu bir $("someid")yöntem içerir ve ayrıca geliştirici araçları "Öğeler" görünümündeki bir öğeyi tıklayabilir ve ardından $0konsoldan ona başvurabilirsiniz . Önceden seçilen eleman olur $1ve böyle devam eder.


1

Buradaki tek sorun yazmaksa, belki de kendinize intellisense ile bir JavaScript editörü almalısınız.

Amaç daha kısa kod almaksa, jQuery gibi bir JavaScript kitaplığı düşünebilir veya kendi kısayol işlevlerinizi yazabilirsiniz, örneğin:

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

Daha iyi performans için yukarıdakileri yapardım. Geçen yıl öğrendiğim şey, sıkıştırma teknikleriyle sunucunun bunu sizin için otomatik olarak yaptığıydı, bu nedenle kısaltma tekniğim aslında kodumu ağırlaştırıyordu. Şimdi tüm document.getElementById dosyasını yazmaktan memnunum.


1

Bir steno işlevi istiyorsan ...

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

veya

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

Ok işlevleri daha kısadır.

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

idArgümanı çevreleyen parantezleri kaldırarak bunu daha da kısaltabilirsiniz .
Shaggy

1

document.querySelectorAll ... select gibi bir jquery sarın

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

// usage: $('$myId')

Oh, ama bununla çalışmak biraz zor görünüyor. İşlev, tanımsız, bir HTMLElement veya bir NodeList döndürebilir. Elbette, kimliğine göre bir öğe almak için kullandığınızda $('#myId'), genellikle o HTMLElement'i döndürmelidir, çünkü umarım bu kimliği tam olarak bir kez atamışsınızdır. Eğer sorgu ile kullanmak olsaydı Ama bu olabilir o hantal alır birden elemanları maç.
Robert

0

Peki, elemanın kimliği global nesnenin herhangi bir özelliğiyle rekabet etmiyorsa, herhangi bir işlev kullanmanız gerekmez.

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

düzenleme: Ama yok bu 'özelliğinin faydalanmak istiyoruz.


:( Bu bana tarayıcının kötüye kullanılması gibi geliyor. Bunun HTML5 spesifikasyonunda nerede geçerli olduğunu göster.
Raynos

1
@Raynos: dev.w3.org/html5/spec/… Ama: "Bunun değişmesi mümkündür. Tarayıcı satıcıları bu davranışı tuhaflık moduyla sınırlamayı düşünüyor." Yine de FF4 ve IE8'imde çalışıyor.
Robert

2
evet şu anda çalışıyor ama kirli hissettiriyor ve yıl sonuna kadar kullanımdan kaldırılırsa şaşırmam.
Raynos

@Raynos Umarım öyledir. Tarayıcıların küresel ad alanını kirletmesini sevmiyorum. Ama öte yandan icat edildiğinde bu o kadar da kötü bir şey değildi. (web sayfaları html merkezli olduğunda ve javascript güzel bir özellikken)
Robert

0

Başka bir paketleyici:

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>

Bu, düşünülemez olanı kullanmak istemiyorsanız yukarıya bakın.


0

Şunun gibi bir sarmalayıcı işlevi kullanabilirsiniz:

const byId = (id) => document.getElementById(id);

Veya

Nesne document.getElementById ile bağlayarak bir değişkene atayın document.

const byId = document.getElementById.bind(document);

Not: İkinci yaklaşımda, eğer bağlanmazsanız document.getElementById, documenthata alırsınız:

Uncaught TypeError: Illegal invocation

Yaptığı Function.bindşey, thisanahtar kelimesi değere ayarlanmış, argüman olarak sağladığınız yeni bir işlev yaratmasıdır Function.bind.

Function.bind için belgeleri okuyun


-1

Bunu dün yazdım ve oldukça faydalı buldum.

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

Bunu nasıl kullanıyorsun.

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

Bu, eval'un iyi bir kullanımı değildir. Değerlendirilmesi gereken öğeyi almakla ilgili hiçbir şey yoktur ve dinamik olarak köşeli parantez gösterimi olan bir özellik elde edebilirsiniz. Developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
ThatsNoMoon
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.