getElementByIdのJavascript省略形


93

JavaScript document.getElementByIdの省略形はありますか?または、私が定義できる方法はありますか?これは、その繰り返しの再入力を取得超えるオーバー


6
誰がそれらに反対票を投じたのかはわかりませんが、このようなショートカットの作成方法がわからないほどJavaScriptに慣れていない人も、jQueryなどで使用しようとすると問題が発生する可能性が高く、 $変数は一貫していません。正解は「いいえ、JavaScriptは基本的に省略形を提供しませんが、DOMノードの選択を容易にするフレームワークがいくつかあります。」
小次郎2011年

回答:


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

$( 'someID' )

ここではを使用しましたが$、任意の有効な変数名を使用できます。

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

byId( 'someID' )

6
@patrick dw好きです。特に有効な変数名が豊富にある場合:)
Fox Wilson

4
「豊富な有効な変数名を使用して」-「少なくとも2つの主要なJSフレームワークがすでにを使用し$ています。それを選択しておめでとうございますか?」
Piskvorが建物を去った

47
$ロードしない場合でも、ライブラリの使用数に違いはありません。
user113716 '19 / 06/19

7
念のため、以前はを使用していましvar $ = document.getElementById.bind(document)bindが、すべてのブラウザで使用できるわけではありません。私はネイティブメソッドのみを使用しているため、おそらくそれはより高速です。これを追加したかっただけです。
pimvdb

7
@Piskvor:私は無知に対応するようにコード化することはありません。無知はコードの破損につながります。壊れたコードは研究につながります。研究は情報につながる。無知は治ります。
user113716

85

余分な文字を保存するには、次のようにStringプロトタイプを汚染します。

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

一部のブラウザで機能し、次の方法で要素にアクセスできます。

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

私はほとんどランダムに物件の名前を選びました。もしあなたが実際にこの略記を使いたいなら、私はタイプしやすいものを思いつくことを勧めます。


12
绎(Yì)-解き明かす(簡体字中国語)
AnnanFay 2011年

8
これは、効率に妥当な影響を与えることを理解しています。プロトタイプで定義されたゲッター/セッターは、桁違いに遅いです。
レイノス2011年

5
また、表示される文字は1つだけかもしれませんが、ファイルでは1バイト以上かかります...
Alnitak

@Alnitak:そうそう、私はそのことを考えていません。さらに、一部の人々(私のような)は、キーボードに绎キーがないため、コピーと貼り付けに多くの時間を費やします。しかし、名前はそれほど重要ではありません。もともと私はプロパティに「e」(要素のように)という名前を付けていましたが、この名前はすでに一部のライブラリによって要求されていると考えました。
Robert

@Raynos:はい、私のベンチマークでは、通常の関数の約3倍の速度です。0.4µs * 3 = 1.2µs
Robert

18

自分で簡単に短縮形を簡単に作成できます。

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

@Sarfraz変数または関数として宣言するのが最善ですか?それも重要ですか?
user1431627 2013年

@ user1431627:変数によって関数式を意味する場合は、スコープの点で重要です。私の回答に投稿された関数は、その実行コンテキストのどこでも使用できます。参照:stackoverflow.com/questions/1013385/...またはkangax.github.io/nfe
Sarfraz

@Sarfraz OK、ありがとう:) jQueryはこれを変数スコープで処理しますよね?私が尋ねる理由は、トップの回答が変数スコープで記述されたためですが、それを正規関数式として記述しました。
user1431627 2013年

13

貢献する簡単な代替策:

HTMLDocument.prototype.e = document.getElementById

次に、ちょうど行います:

document.e('id');

落とし穴があります。プロトタイプを拡張できないブラウザ(IE6など)では機能しません。


2
@ walle1357:この記事に興味があるかもしれません。
user113716 2011年

5
@ThiefMaster 「Do n't do X」はあなたが与えることができる最悪のアドバイスについてです。代替案、長所と短所を把握し、特定の問題ごとに最適な答えを選択してください。この場合、プロトタイプを拡張しても害はありません(他の回答の方が適していると言えるはずですが、これは完了のためだけに残されています)
Pablo Fernandez

一部のブラウザまたは将来、何も壊さないことをどのようにして知っていますか?
ThiefMaster 2011

@PabloFernandez:ホストオブジェクトを拡張する必要はありません。少なくとも2つのライブラリが同じ名前のプロパティでホストオブジェクトを拡張する場合、最初の注意深いライブラリまたは最後の不注意なライブラリのみが成功します。
ロバート

1
@Robertこれは明らかに最良のオプションではありません、オプションです。あなたは一人一人の長所と短所を考慮する必要があります。クライアント側のjavascriptライブラリは、prototype.jsこれとまったく同じことを始めたものであることを覚えておいてください。
Pablo Fernandez、

8

(IDで要素を取得するだけでなく、クラス:Pで要素を取得するための省略形)

私はのようなものを使用します

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

使用法:_(".test")クラス名を持つすべての要素を返しtestて、_("#blah")idを持つ要素を返しますblah


6
カスタム関数でメソッドのdocument.querySelectorAll一部をエミュレートするのではなく、のショートカットを作成することをお勧めしquerySelectorAllます。
Rob W

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

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

7

IDはに保存されますwindow

HTML

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

JS

logo.innerHTML;

書くことと同じです:

document.getElementById( 'logo' ).innerHtml;

前者の方法は一般的な方法ではないため、使用しないことをお勧めします。


この方法の使用を勧めない理由を詳しく教えてください。
Okku

私はそれが賭けの練習であるとは思わないので、私はそれが今まで使われるのを見ません。しかし、それはそれを見つけるための最短の方法です。
im_benton 2015

@Okkuのため<div id="location"></div>、呼び出しwindow.locationは機能しません。
Alex

6

ここにはいくつかの良い答えがあり、いくつかはjQueryのような構文について踊っていますが、実際にjQueryを使用していることについて言及している人はいません。試すことに反対がない場合は、jQueryをチェックしてください。このように非常に簡単に要素を選択できます。

ID別

$('#elementId')

CSSクラス

$('.className')

要素タイプ別

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

3
jQueryを試しましたが、getElementByIdの省略形のためだけにライブラリ全体が本当に必要ですか?
Fox Wilson、

他の答えの「jQueryのような構文」とは何ですか?ほとんどの場合、それらは変数によって参照される単純な古い関数です。これについては、jQueryのような独自のものは何もありません。; o)
user113716

3
@patrick dw、そうですね、あなたの答え$( 'someID')はjQuery IDセレクター$( '#someID'):)のように見えません
Kon

5

組み込みのものはありません。

グローバル名前空間を汚染することを気にしないのなら、なぜですか:

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

EDIT -私は何かをする関数名を変更珍しいが、短いとそうでない場合はjQueryのまたは裸使用しています何か他のものと衝突しませ$サイン。


3

はい、それは同じ機能を使用するために、繰り返し取得上の異なる引数で毎回:

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

したがって、これらすべての引数を同時に取る関数がいいでしょう。

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

次に、1つのオブジェクトに格納されているすべての要素への参照があります。

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

ただし、これらのIDをすべてリストする必要があります。

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

しかし、要素が多い場合、この関数を呼び出すのはかなりコストがかかります。


したがって、理論的には、withキーワードを使用する場合、次のようなコードを記述できます。

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

しかし、私はの使用を促進したくありませんwith。おそらくそれを行うためのより良い方法があります。


2

まあ、あなたは速記関数を作成することができます、それは私がすることです。

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

そしてそれを手に入れたいときは

$('yourid')

また、私が見つけたもう1つの便利なトリックは、アイテムIDの値またはinnerHTMLを取得したい場合、次のような関数を作成できることです。

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

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

あなたがそれを好き願っています!

私はこのアイデア全体に基づいて、一種のミニJavaScriptライブラリを実際に作成しました。 こちらです。


私はこの質問をもう一度見ていましたが、これを見つけました。すべてのjQueryを含めたくない場合、これは非常にきちんとしたライブラリです。
Fox Wilson

2

私は頻繁に使用します:

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


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

次のようなことができるので、外部関数($()またはなどbyId())よりも優れていると思います。

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


ところで、これにはjQueryを使用しないでください。jQueryは、、、またはのdocument.getElementById()ような外部関数、または私のメソッドよりもはるかに遅くなります。http//jsperf.com/document-getelementbyid-vs-jquery/5$()byId()


1

これが自分のサイトにある場合は、jQueryなどのライブラリの使用を検討してくださいこれと、ブラウザの違いを抽象化する他の多くの便利な省略形を提供することをください。個人的には、筆記者が気になるほどのコードを書いたら、jQueryを含めます。

jQueryでは、構文は次のようになります。 $("#someid")。次に、jQueryラッパーではなく実際のDOM要素が必要な場合は、$("#someid")[0]が必要な場合はですが、jQueryラッパーを使用して、後は何でもできる可能性があります。

または、ブラウザ開発者コンソールでこれを使用している場合は、それらの組み込みユーティリティを調べてください。他の誰かが述べたように、Chrome JavaScriptコンソールには$("someid")メソッドが含まれており、開発者ツールの「要素」ビューで要素をクリックし$0て、コンソールから参照することもできます。以前に選択した要素が以下同様になり$1ます。


1

ここでの唯一の問題がタイピングである場合は、おそらく、intellisenseを備えたJavaScriptエディターを入手する必要があります。

目的が短いコードを取得することである場合は、jQueryのようなJavaScriptライブラリを検討するか、次のような独自の簡略関数を作成することができます。

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

以前は、パフォーマンスを向上させるために上記を行っていました。昨年学んだことは、圧縮技術ではサーバーが自動的にそれを行うので、私の短縮技術は実際に私のコードをより重くしていたということです。今度は、document.getElementById全体を入力して満足しています。


1

簡単な機能を求めている場合...

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

または

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

矢印関数の作成が短くなります。

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

id引数を囲む括弧を削除することで、さらに短くすることができます。
シャギー

1

document.querySelectorAllをラップします... selectのようなjquery

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

// usage: $('$myId')

ああ、でもこれは作業が少し難しいようです。この関数は、未定義のHTMLElementまたはNodeListを返す可能性があります。もちろん、それを使用してIDで要素を取得すると、$('#myId')通常はそのHTMLElementが返されます。しかし、複数の要素に一致する可能性のあるクエリで使用すると、面倒になります。
ロバート

0

要素のIDがグローバルオブジェクトのプロパティと競合しない場合は、関数を使用する必要はありません。

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

編集:しかし、この「機能」を利用したくありません。


:(これはHTML5の仕様で有効です私には、ブラウザの乱用のような音が私を示すこと。。
レイノス

1
@Raynos:dev.w3.org/html5/spec/…しかし、「これが変更される可能性があります。ブラウザのベンダーは、この動作を互換モードに制限することを検討しています。」私のFF4とIE8でも動作します。
Robert

2
はい、それは今は機能しますが、それは汚いと感じ、年末までに非推奨になっても驚かないでしょう。
レイノス

@Raynosそう思います。ブラウザがグローバル名前空間を汚染するのは好きではありません。しかし、一方で、それが発明されたとき、これはそれほど悪いことではありませんでした。(ウェブページがHTML中心で、JavaScriptが優れた機能だった場合)
Robert

0

別のラッパー:

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>

これは、unthinkableを使用したくない場合に備えて、上記を参照してください。


-1

私はこれを昨日書きました、そしてそれは非常に役に立ちました。

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

これがあなたの使い方です。

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

これはevalの良い使い方ではありません。evalを必要とする要素を取得することは何もありません。ブラケット表記を使用してプロパティを動的に取得できます。developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…を
ThatsNoMoon
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.