Singkatan Javascript untuk getElementById

93

Apakah ada singkatan untuk JavaScript document.getElementById? Atau adakah cara saya bisa mendefinisikannya? Ia mendapat mengetik ulang berulang-ulang yang lebih dan lebih .

Fox Wilson
sumber
6
Saya tidak tahu siapa yang menurunkan suara mereka, tetapi seseorang yang tidak cukup akrab dengan Javascript sehingga dia tidak tahu cara membuat pintasan seperti ini juga cenderung mengalami masalah ketika dia mencoba menggunakannya dengan, katakanlah, jQuery, dan menemukannya variabel $ tidak konsisten. Jawaban yang benar adalah "Tidak, Javascript asli tidak menawarkan cara singkat, tetapi ada beberapa kerangka kerja yang membuat pemilihan simpul DOM lebih mudah."
kojiro

Jawaban:

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

$( 'someID' )

Di sini saya menggunakan $, tetapi Anda dapat menggunakan nama variabel yang valid.

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

byId( 'someID' )
pengguna113716
sumber
6
@patrick dw saya suka itu. Terutama dengan banyaknya nama variabel yang valid di luar sana :)
Fox Wilson
4
"dengan kekayaan nama variabel yang valid" - maksud Anda "setidaknya dua framework JS utama sudah digunakan $, selamat memilihnya juga?"
Piskvor meninggalkan gedung
47
Tidak ada bedanya berapa banyak perpustakaan yang digunakan $jika Anda tidak pernah memuatnya.
pengguna113716
7
Sekadar catatan, dulu saya melakukannya var $ = document.getElementById.bind(document), tetapi bindtidak tersedia di semua browser. Mungkin lebih cepat, karena saya hanya menggunakan metode asli. Hanya ingin menambahkan ini.
pimvdb
7
@Piskvor: Saya tidak pernah membuat kode untuk mengakomodasi ketidaktahuan. Ketidaktahuan menyebabkan kode rusak. Kode rusak mengarah ke penelitian. Penelitian mengarah pada informasi. Ketidaktahuan disembuhkan.
pengguna113716
85

Untuk menyimpan karakter tambahan Anda dapat mencemari prototipe String seperti ini:

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

Ini berfungsi di beberapa browser dan Anda dapat mengakses elemen dengan cara ini:

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

Saya telah memilih nama properti hampir secara acak. Jika Anda benar-benar ingin menggunakan singkatan ini, saya sarankan untuk membuat sesuatu yang lebih mudah untuk diketik.

Robert
sumber
12
绎 (Yì) - Unravel (Mandarin Sederhana)
AnnanFay
8
Anda benar-benar menyadari bahwa ini membutuhkan efisiensi yang wajar. pengambil / penyetel yang didefinisikan pada prototipe adalah urutan besarnya lebih lambat.
Raynos
5
juga, itu mungkin hanya satu karakter yang terlihat , tetapi itu akan membutuhkan lebih dari satu byte dalam file ...
Alnitak
@ Alnitak: oh iya, saya belum memikirkan itu. Selain itu, beberapa orang (seperti saya) tidak memiliki tombol 绎 di keyboard mereka, jadi mereka akan menghabiskan banyak waktu untuk menyalin & menempelkannya. Tapi namanya tidak terlalu penting. Awalnya saya menamai properti 'e' (elemen suka) tapi saya pikir nama ini sudah bisa diklaim oleh beberapa perpustakaan.
Robert
@Raynos: Ya, menurut tolok ukur saya, ini sekitar tiga kali lebih lambat dari fungsi biasa. 0.4µs ​​* 3 = 1.2µs
Robert
18

Anda dapat dengan mudah membuat singkatan sendiri dengan mudah:

function getE(id){
   return document.getElementById(id);
}
Sarfraz
sumber
@Sarfraz Apakah yang terbaik untuk mendeklarasikannya sebagai variabel atau fungsi? Apakah itu penting?
pengguna1431627
@ user1431627: Jika yang Anda maksud dengan variabel adalah ekspresi fungsi maka itu penting dalam hal ruang lingkup. Fungsi yang diposting di jawaban saya akan tersedia di mana saja dalam konteks pelaksanaannya. Lihat: stackoverflow.com/questions/1013385/… atau kangax.github.io/nfe
Sarfraz
@ Syfraz Ok, terima kasih :) jQuery menangani ini dalam lingkup variabel, bukan? Alasan mengapa saya bertanya adalah karena jawaban teratas ditulis dengan cakupan variabel, tetapi Anda menulisnya sebagai ekspresi fungsi reguler.
pengguna1431627
13

Alternatif cepat untuk berkontribusi:

HTMLDocument.prototype.e = document.getElementById

Kemudian lakukan saja:

document.e('id');

Ada tangkapan, itu tidak berfungsi di browser yang tidak memungkinkan Anda memperluas prototipe (misalnya IE6).

Pablo Fernandez
sumber
2
@ walle1357: Artikel ini mungkin menarik bagi Anda.
pengguna113716
5
@ThiefMaster "Jangan pernah melakukan X" adalah tentang nasihat terburuk yang dapat Anda berikan. Ketahui alternatif, pro dan kontra, dan pilih jawaban terbaik untuk setiap masalah tertentu. Tidak ada salahnya memperpanjang prototipe dalam kasus ini (Meskipun saya harus mengatakan bahwa jawaban lain lebih cocok, yang ini hanya tersisa untuk penyelesaian)
Pablo Fernandez
Bagaimana Anda tahu itu tidak akan merusak apa pun di beberapa browser atau di masa mendatang?
ThiefMaster
@PabloFernandez: Anda masih tidak ingin memperluas objek host. Jika setidaknya dua pustaka ingin memperluas objek host dengan properti bernama identik maka hanya pustaka pertama yang cermat atau pustaka ceroboh terakhir yang akan berhasil.
Robert
1
@Robert ini jelas bukan pilihan terbaik, tetapi ini adalah pilihan. Anda perlu mempertimbangkan pro dan kontra dari setiap orang. Ingat bahwa pustaka javascript sisi klien dimulai prototype.jsyang melakukan hal yang persis sama.
Pablo Fernandez
8

(Singkatan tidak hanya mendapatkan elemen berdasarkan ID, tetapi juga mendapatkan elemen berdasarkan kelas: P)

Saya menggunakan sesuatu seperti

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

Penggunaan: _(".test")mengembalikan semua elemen dengan nama kelas test, dan _("#blah")mengembalikan elemen dengan id blah.

JiminP
sumber
6
Anda sebaiknya membuat pintasan untuk document.querySelectorAll, daripada mencoba meniru bagian dari querySelectorAllmetode dalam fungsi khusus.
Rob W
7
<script>
var _ = function(eId)
{
    return getElementById(eId);
}
</script>

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

id disimpan ke window.

HTML

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

JS

logo.innerHTML;

sama dengan menulis:

document.getElementById( 'logo' ).innerHtml;

Saya tidak menyarankan menggunakan metode sebelumnya karena ini bukan praktik umum.

im_benton
sumber
Bisakah Anda menjelaskan mengapa Anda tidak menyarankan menggunakan metode ini?
Okku
Saya tidak pernah melihatnya digunakan karena menurut saya ini bukan latihan taruhan. Tetapi ini adalah cara terpendek untuk menemukannya.
im_benton
@ Okku karena <div id="location"></div>dan menelepon window.locationtidak akan bekerja.
Alex
6

Ada beberapa jawaban bagus di sini dan beberapa menari di sekitar sintaks seperti jQuery, tetapi tidak ada yang menyebutkan benar-benar menggunakan jQuery. Jika Anda tidak menentang mencobanya, lihat jQuery . Ini memungkinkan Anda memilih elemen super mudah seperti ini ..

Menurut ID :

$('#elementId')

Menurut kelas CSS :

$('.className')

Menurut jenis elemen :

$('a')  // all anchors on page 
$('inputs')  // all inputs on page 
$('p a')  // all anchors within paragaphs on page 
Kon
sumber
3
Saya mencoba jQuery, tetapi apakah saya benar-benar memerlukan seluruh pustaka hanya untuk singkatan getElementById?
Fox Wilson
Apa yang dimaksud dengan "sintaks seperti jQuery" di jawaban lain? Sebagian besar hanya fungsi lama biasa yang direferensikan oleh variabel. Tidak ada yang unik seperti jQuery tentang itu. ; o)
pengguna113716
3
@patrick dw, Benar, jawaban Anda $ ('someID') tidak terlihat seperti pemilih ID jQuery $ ('# someID') :)
Kon
5

Tidak ada yang terintegrasi.

Jika Anda tidak keberatan mencemari namespace global, mengapa tidak:

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

EDIT - Saya mengubah nama fungsi menjadi sesuatu yang tidak biasa , tetapi pendek dan tidak bentrok dengan jQuery atau apa pun yang menggunakan $tanda kosong .

Alnitak
sumber
3

Ya, itu akan berulang-ulang untuk menggunakan fungsi yang sama lebih dan lebih setiap kali dengan argumen yang berbeda:

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

Jadi, hal yang menyenangkan adalah fungsi yang mengambil semua argumen tersebut pada saat yang bersamaan:

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

Maka Anda akan memiliki referensi ke semua elemen Anda yang disimpan dalam satu objek:

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

Tapi Anda masih harus mencantumkan semua id itu.

Anda dapat lebih menyederhanakannya jika Anda menginginkan semua elemen dengan 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;
}

Tetapi akan sangat mahal untuk memanggil fungsi ini jika Anda memiliki banyak elemen.


Jadi, secara teoritis, jika Anda akan menggunakan withkata kunci tersebut, Anda dapat menulis kode seperti ini:

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

Tapi saya tidak ingin mempromosikan penggunaan with. Mungkin ada cara yang lebih baik untuk melakukannya.

Robert
sumber
2

Nah, Anda bisa membuat fungsi singkatan, itulah yang saya lakukan.

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

dan kemudian ketika Anda ingin mendapatkannya, lakukan saja

$('yourid')

Juga, trik berguna lainnya yang saya temukan, adalah jika Anda ingin mendapatkan nilai atau innerHTML dari ID item, Anda dapat membuat fungsi seperti ini:

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

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

Harap Anda menyukainya!

Saya sebenarnya membuat semacam pustaka javascript mini berdasarkan seluruh ide ini. Ini dia.

pengguna3385777
sumber
Saya hanya melihat pertanyaan ini lagi, dan menemukan ini. Ini adalah pustaka yang cukup rapi jika Anda tidak ingin menyertakan semua jQuery.
Fox Wilson
2

Saya sering menggunakan:

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


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

Saya pikir ini lebih baik daripada fungsi eksternal (misalnya $()atau byId()) karena Anda dapat melakukan hal-hal seperti ini:

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


Btw, jangan gunakan jQuery untuk ini, jQuery jauh lebih lambat daripada document.getElementById(), fungsi eksternal seperti $()or byId(), atau metode saya: http://jsperf.com/document-getelementbyid-vs-jquery/5

Gilles Castel
sumber
1

Jika ini ada di situs Anda sendiri, pertimbangkan untuk menggunakan pustaka seperti jQuery untuk memberi Anda ini dan banyak singkatan berguna lainnya yang juga mengabstraksi perbedaan browser. Secara pribadi, jika saya menulis cukup banyak kode untuk diganggu dengan cara lama, saya akan menyertakan jQuery.

Di jQuery, sintaksnya adalah $("#someid"). Jika Anda kemudian menginginkan elemen DOM yang sebenarnya dan bukan pembungkus jQuery, itu $("#someid")[0], tetapi Anda kemungkinan besar dapat melakukan apa pun yang Anda cari dengan pembungkus jQuery.

Atau, jika Anda menggunakan ini di konsol pengembang browser, teliti utilitas bawaan mereka. Seperti yang disebutkan orang lain, konsol JavaScript Chrome menyertakan sebuah $("someid")metode, dan Anda juga dapat mengeklik elemen di tampilan "Elemen" alat pengembang lalu mereferensikannya $0dari konsol. Elemen yang dipilih sebelumnya menjadi $1dan seterusnya.

Henrik N
sumber
1

Jika satu-satunya masalah di sini adalah mengetik, mungkin Anda harus mendapatkan editor JavaScript dengan intellisense sendiri.

Jika tujuannya adalah untuk mendapatkan kode yang lebih pendek, Anda dapat mempertimbangkan pustaka JavaScript seperti jQuery, atau Anda dapat menulis fungsi singkat Anda sendiri, seperti:

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

Saya biasa melakukan hal di atas untuk kinerja yang lebih baik. Apa yang saya pelajari tahun lalu adalah bahwa dengan teknik kompresi server melakukannya secara otomatis untuk Anda, jadi teknik pemendekan saya sebenarnya membuat kode saya lebih berat. Sekarang saya senang mengetik seluruh document.getElementById.

Christophe
sumber
1

Jika Anda meminta fungsi singkatan ...

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

atau

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

Fungsi panah membuat lebih pendek.

var $id = (id) => document.getElementById(id);
wiktor
sumber
Anda dapat mempersingkatnya lebih jauh dengan menghapus tanda kurung yang menyertakan idargumen.
Shaggy
1

bungkus document.querySelectorAll ... jquery seperti pilih

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

// usage: $('$myId')

sumber
Oh, tapi ini terlihat agak sulit untuk dikerjakan. Fungsi dapat mengembalikan tidak terdefinisi, HTMLElement atau NodeList. Tentu saja ketika Anda menggunakannya untuk mendapatkan elemen dengan id-nya $('#myId')maka biasanya HTMLElement itu harus dikembalikan, karena Anda diharapkan menetapkan id itu tepat sekali. Tetapi jika Anda akan menggunakannya dengan kueri yang mungkin cocok dengan beberapa elemen, itu menjadi tidak praktis.
Robert
0

Nah, jika id elemen tidak bersaing dengan properti apa pun dari objek global, Anda tidak perlu menggunakan fungsi apa pun.

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

edit: Tapi Anda tidak ingin menggunakan 'fitur' ini.

Robert
sumber
:( Kedengarannya seperti penyalahgunaan browser bagi saya. Tunjukkan di mana ini valid dalam spesifikasi HTML5.
Raynos
1
@Raynos: dev.w3.org/html5/spec/… Tapi: "Ada kemungkinan hal ini akan berubah. Vendor browser sedang mempertimbangkan untuk membatasi perilaku ini ke mode quirks." Bekerja di FF4 dan IE8 saya.
Robert
2
ya ini berfungsi sekarang tetapi rasanya kotor dan saya tidak akan terkejut jika itu tidak digunakan lagi pada akhir tahun.
Raynos
@Raynos Saya harap begitu. Saya tidak suka browser mencemari namespace global. Tapi di sisi lain, ini bukanlah hal yang buruk ketika ditemukan. (ketika laman web berpusat pada html dan javascript adalah fitur yang bagus)
Robert
0

Pembungkus lain:

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>

Ini, jika Anda tidak ingin menggunakan yang tidak terpikirkan , lihat di atas.

Mike C.
sumber
-1

Saya menulis ini kemarin dan merasa cukup berguna.

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

Beginilah cara Anda menggunakannya.

// 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
sumber
Ini bukan penggunaan eval. Tidak ada apa-apa tentang mendapatkan elemen yang perlu eval, dan Anda bisa secara dinamis mendapatkan properti dengan notasi braket. Lihat developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
ThatsNoMoon