getElementById에 대한 자바 스크립트 약어


93

JavaScript document.getElementById에 대한 속기가 있습니까? 아니면 내가 정의 할 수있는 방법이 있습니까? 그것은 그 반복적 인 재 입력을 얻을 이상이상 .


6
누가 그들을 비추천했는지는 모르겠지만, 자바 스크립트에 익숙하지 않아 이와 같은 단축키를 만드는 방법을 모르는 사람도 jQuery와 같이 사용하려고 할 때 문제가 발생할 가능성이 있습니다. $ 변수가 일치하지 않습니다. 정답은 "아니요, 기본적으로 Javascript는 속기를 제공하지 않지만 DOM 노드를 더 쉽게 선택할 수있는 여러 프레임 워크가 있습니다."입니다.
kojiro

답변:


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
"유효한 변수 이름이 풍부합니다."- "최소한 두 개의 주요 JS 프레임 워크가 이미을 사용 $하고 있습니다.이를 선택하게 된 것을 축하합니다."라는 의미입니까?
Piskvor 건물 왼쪽

47
$로드하지 않는 경우 사용 하는 라이브러리 수는 차이가 없습니다 .
user113716

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ì)-Unravel (중국어 간체)
AnnanFay 2011-06-20

8
이것이 효율성면에서 합당한 타격을 받는다는 것을 알고 있습니다. 프로토 타입에 정의 된 getter / setter는 훨씬 느립니다.
Raynos 2011-06-20

5
또한 하나의 보이는 문자 일 수 있지만 파일에서 2 바이트 이상을 차지합니다 ...
Alnitak 2011-06-20

@Alnitak : 아 맞다, 나는 그것을 생각하지 않았다. 또한 저와 같은 일부 사람들은 키보드에 绎 키가 없기 때문에 복사 및 붙여 넣기에 많은 시간을 할애합니다. 하지만 그 이름은 그다지 중요하지 않습니다. 원래 속성 이름을 'e'(예 : 요소)로 지정했지만 이미 일부 도서관에서이 이름을 주장 할 수 있다고 생각했습니다.
Robert

@Raynos : 예, 내 벤치 마크에서는 일반 함수보다 약 3 배 느립니다. 0.4µs ​​* 3 = 1.2µs
Robert

18

속기를 쉽게 직접 만들 수 있습니다.

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

@Sarfraz 변수 또는 함수로 선언하는 것이 가장 좋습니까? 그것이 중요합니까?
user1431627

@ user1431627 : 변수로 함수 표현을 의미했다면 범위 측면에서 중요합니다. 내 답변에 게시 된 함수는 실행 컨텍스트의 모든 곳에서 사용할 수 있습니다. 참조 : stackoverflow.com/questions/1013385/… 또는 kangax.github.io/nfe
Sarfraz

@Sarfraz 좋아, 감사합니다 :) jQuery는 이것을 변수 범위에서 처리합니다. 내가 묻는 이유는 최상위 답변이 변수 범위로 작성되었지만 정규 함수 표현식으로 작성했기 때문입니다.
user1431627

13

기여할 수있는 빠른 대안 :

HTMLDocument.prototype.e = document.getElementById

그런 다음 다음을 수행하십시오.

document.e('id');

캐치가 있습니다. 프로토 타입을 확장 할 수없는 브라우저 (예 : IE6)에서는 작동하지 않습니다.


2
@ walle1357 : 이 기사에 관심 있을 수 있습니다.
user113716

5
@ThiefMaster "X를하지 마십시오" 는 당신이 줄 수있는 최악의 조언에 관한 것입니다. 대안, 장단점을 알고 모든 특정 문제에 대한 최상의 답변을 선택하십시오. 이 경우 프로토 타입을 확장에 전혀 해가 없다 (나는 다른 답변이 더 잘 맞는 것을 말을해야하지만,이 일에만 완료 방치)
파블로 페르난데스을

일부 브라우저에서 또는 미래에 아무것도 깨지지 않을 것이라는 것을 어떻게 알 수 있습니까?
ThiefMaster

@PabloFernandez : 여전히 호스트 개체를 확장하고 싶지 않습니다. 적어도 두 개의 라이브러리가 동일한 이름의 속성으로 호스트 개체를 확장하려는 경우 첫 번째 신중한 라이브러리 또는 마지막 부주의 한 라이브러리 만 성공합니다.
Robert

1
이 명확하게 최선의 선택은 아니지만 @Robert 입니다 옵션. 모든 사람의 장단점을 고려해야합니다. 클라이언트 측 자바 스크립트 라이브러리로 시작 기억 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.querySelectorAllquerySelectorAll사용자 지정 함수에서 메서드 의 일부를 에뮬레이트하는 대신에 .
Rob W

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

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

7

아이디는 window .

HTML

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

JS

logo.innerHTML;

다음과 같이 쓰는 것과 같습니다.

document.getElementById( 'logo' ).innerHtml;

일반적인 관행이 아니므로 이전 방법을 사용하지 않는 것이 좋습니다.


이 방법을 사용하지 않는 이유에 대해 자세히 설명해 주시겠습니까?
Okku

나는 그것이 내기 연습이라고 생각하지 않기 때문에 그것이 사용되는 것을 보지 못했습니다. 그러나 그것을 찾는 가장 짧은 방법입니다.
im_benton 2015-08-10

@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 2011-06-18

3
@patrick dw, 맞아요, 귀하의 답변 $ ( 'someID')는 jQuery ID 선택기 $ ( '# someID') :)
Kon

5

내장 된 것이 없습니다.

전역 네임 스페이스를 오염 시켜도 괜찮다면 다음을 수행하십시오.

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

편집-나는 함수 이름을 특이한 것으로 변경 했지만 짧고 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;
}

그런 다음 모든 요소에 대한 참조가 하나의 개체에 저장됩니다.

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

또한 내가 찾은 또 다른 유용한 트릭은 항목 ID의 값 또는 innerHTML을 얻으려면 다음과 같은 함수를 만들 수 있다는 것입니다.

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

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

네가 좋아하길 바래!

저는이 아이디어를 바탕으로 일종의 미니 자바 스크립트 라이브러리를 만들었습니다. 여기 있습니다.


이 질문을 다시보고 있었는데 이것을 발견했습니다. 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]


Btw, jQuery를 사용하지 마십시오. jQuery는 or document.getElementById()와 같은 외부 함수 또는 내 방법 보다 훨씬 느립니다 . http://jsperf.com/document-getelementbyid-vs-jquery/5$()byId()


1

이것이 귀하의 사이트에 있다면 jQuery 와 같은 라이브러리 사용을 고려하십시오. 하여이 기능과 브라우저 차이를 추상화하는 다른 많은 유용한 속기를 제공 . 개인적으로 오랜 시간 동안 귀찮게 할 충분한 코드를 작성했다면 jQuery를 포함시킬 것입니다.

jQuery에서 구문은 $("#someid"). 그런 다음 jQuery 래퍼가 아닌 실제 DOM 요소를 원하면 $("#someid")[0]이지만 jQuery 래퍼를 사용하여 원하는 모든 작업을 수행 할 수 있습니다.

또는 브라우저 개발자 콘솔에서이를 사용하는 경우 기본 제공 유틸리티를 조사하십시오. 다른 사람이 언급했듯이 Chrome 자바 스크립트 콘솔에는 $("someid")메소드가 포함 되어 있으며 개발자 도구 '요소'보기에서 요소를 클릭 한 다음 $0콘솔에서 참조 할 수도 있습니다. 이전에 선택한 요소가 $1됩니다.


1

여기서 유일한 문제가 타이핑이라면, 아마도 당신은 인텔리 센스가있는 자바 스크립트 편집기를 얻어야 할 것입니다.

목적이 더 짧은 코드를 얻는 것이라면 jQuery와 같은 자바 스크립트 라이브러리를 고려하거나 다음과 같이 자신 만의 속기 함수를 작성할 수 있습니다.

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인수를 둘러싼 괄호를 제거하여 더 짧게 만들 수 있습니다 .
Shaggy

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')로 요소를 가져 오는 데 사용하면 일반적으로 해당 ID를 정확히 한 번 할당했기 때문에 해당 HTMLElement를 반환해야합니다. 그러나 여러 요소와 일치 할 있는 쿼리와 함께 사용 하면 번거 롭습니다.
로버트

0

글쎄, 요소의 id가 전역 객체의 속성과 경쟁하지 않는다면 어떤 기능도 사용할 필요가 없습니다.

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

편집 : 그러나이 '기능'을 사용하고 싶지 않습니다 .


:( 브라우저 남용처럼 들립니다. HTML5 사양에서 이것이 유효한 위치를 보여주세요.
Raynos

1
@Raynos : dev.w3.org/html5/spec/… 그러나 : "이것은 변경 될 가능성이 있습니다. 브라우저 공급 업체는이 동작을 쿼크 모드로 제한하는 것을 고려하고 있습니다." 그래도 내 FF4 및 IE8에서 작동합니다.
로버트

2
예, 지금은 작동하지만 더러운 느낌이 들고 연말까지 사용이 중단되면 놀라지 않을 것입니다.
Raynos

@ Raynos 그렇게 바랍니다. 브라우저가 글로벌 네임 스페이스를 오염시키는 것을 좋아하지 않습니다. 그러나 다른 한편으로 이것은 발명되었을 때 그렇게 나쁜 것이 아닙니다. (웹 페이지가 html 중심이고 자바 스크립트가 좋은 기능이었을 때)
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>

이것은 생각할 수없는 을 사용하고 싶지 않은 경우 위를 참조하십시오.


-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의 좋은 사용법이 아닙니다. 평가가 필요한 요소를 가져 오는 방법은 없으며 대괄호 표기법을 사용하여 동적으로 속성을 가져올 수 있습니다. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
ThatsNoMoon
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.