JQuery Selector에서 DOM 요소를 얻는 방법


179

jquery 선택기에서 실제 DOMElement를 가져 오는 것을 찾는 데 상당히 어려움이 있습니다. 샘플 코드 :

<input type="checkbox" id="bob" />
  var checkbox = $("#bob").click(function() { //some code  } )

그리고 다른 코드 조각에서 확인란의 선택된 값을 결정하려고합니다.

  if ( checkbox.eq(0).SomeMethodToGetARealDomElement().checked )
    //do something.

그리고 제발, 나는하고 싶지 않습니다 :

  if ( checkbox.eq(0).is(":checked"))
    //do something

그것은 확인란 주위에 있지만 다른 경우에는 실제 DOMElement가 필요했습니다.


4
이것이 필요할 수있는 한 가지 경우 : Knockout.js에서 함수 applyBindings는 jQuery 선택기가 아닌 DOM 노드를 기대합니다. 이 질문 (과 그 답)은 정확히 필요한 것입니다.
Muhammad Alkarouri

답변:


264

다음을 사용하여 원시 DOM 요소에 액세스 할 수 있습니다.

$("table").get(0);

또는 더 간단하게 :

$("table")[0];

그러나 실제로는 (내 경험상) 필요한 것이 많지 않습니다. 확인란 예를 보자.

$(":checkbox").click(function() {
  if ($(this).is(":checked")) {
    // do stuff
  }
});

더 "jquery'ish"이고 (imho) 더 간결합니다. 번호를 매기려면 어떻게해야합니까?

$(":checkbox").each(function(i, elem) {
  $(elem).data("index", i);
});
$(":checkbox").click(function() {
  if ($(this).is(":checked") && $(this).data("index") == 0) {
    // do stuff
  }
});

이러한 기능 중 일부는 브라우저의 차이점도 숨길 수 있습니다. 일부 특성은 다를 수 있습니다. 전형적인 예는 AJAX 호출입니다. 원시 Javascript 에서이 작업을 올바르게 수행하려면 약 7 가지 대체 사례가 XmlHttpRequest있습니다.


1
고맙지 만 get 메소드는 여전히 dom 요소가 아닌 jquery 요소를 반환합니다. 그렇지 않으면 .checked 속성 호출이 작동했을 것입니다.
BillRob 2009

$('a').get(0).nodeType==1이 페이지의 Firebug를 사용해보십시오 . true로 평가됩니까 아니면 실패합니까?
meder omuraliev 2009

@BillRob get ()이 DOM 요소를 반환하지 않으면 문제가있는 것입니다. 여기에 문서를 참조하십시오 : docs.jquery.com/Core/get#index
Sixten 오토

$('<input type=checkbox>').appendTo('body').get(0).checked
meder omuraliev 2009

5
DOM 속성을 명시 적으로 사용하려는 경우 jQuery를 사용하는 요점은 무엇입니까? 가능한 TypeError에 대해 오류를 방지하는 일관된 코드를 갖는 것이 더 좋지 않습니까? 몇 년 전 나는 엘리트 주의자 ECMAScripter 였고 프레임 워크를 피했지만 불일치에 대해 더 많이 알게되자 결국 더 의존하게되었습니다. 속도가 눈에 띄지 않는 한 브라우저 엔진은 점점 더 빨라지고 있습니다. 프레임 워크를 사용하는 요점은 가능한 한 빨리 작업하지 않고 많은 문제를 해결하는 실행 가능한 일관된 코드를 갖는 것입니다.
meder omuraliev

7

편집 : 요소를 얻을 수 없다고 가정하는 것이 잘못 된 것 같습니다. 다른 사람들이 여기에 게시 한 것처럼 다음을 얻을 수 있습니다.

$('#element').get(0);

실제로 일치하는 DOM 요소를 반환하는지 확인했습니다.


2
모든 브라우저에서 반복되는 것은 아닙니다. IE7 및 이전 버전에서는 실패합니다.
Slavo

6

요소를 문자열로 가져와야했습니다.

jQuery("#bob").get(0).outerHTML;

어느 것이 당신에게 뭔가를 줄 것입니다 :

<input type="text" id="bob" value="hello world" />

... DOM 요소가 아닌 문자열로.


1

DOM 요소와 직접 상호 작용 해야하는 document.getElementById경우 특정 요소와 상호 작용하려는 경우 클래스 이름이 하나의 요소에만 있거나 다른 옵션이 있다고 가정하면 ID를 알고있을 것입니다. 위험하다.

그러나 나는 다른 사람들과 동의하는 경향이 있습니다. 대부분의 경우 jQuery가 제공하는 것을 매우 유연하게 사용하여 필요한 것을 수행하는 법을 배워야합니다.

업데이트 : 의견을 기반으로 : 다음은 좋은 설명이있는 게시물입니다 : http://www.mail-archive.com/jquery-en@googlegroups.com/msg04461.html

$(this).attr("checked") ? $(this).val() : 0

체크되어 있으면 값을 반환하고 그렇지 않으면 0을 반환합니다.

$(this).val() 그냥 dom에 도달하고 검사 여부에 관계없이 요소의 "value"속성을 가져옵니다.


2
document.getElementById 또는 MS ajax $ get 메소드를 사용할 수 있습니다. MS가 jquery를 승인했기 때문에 ms ajax javascript에 대한 의존을 깨고 jquery를 배우려고합니다. jquery가 확인란 .val () 메서드의 동작을 변경한다는 것은 전적으로 직관적이지 않은 것 같습니다. 다른 모든 .val () 호출은 양식 게시 필드를 반환합니다. jQuery는 작업하기에 너무 좋았으므로 val () 메소드를 변경하는 것이 혼란스럽고 빠른 해결 방법을 찾고있었습니다.
BillRob 2009

2
다음 페이지를 확인하십시오. mail-archive.com/jquery-en@googlegroups.com/msg04461.html
James Black

2
James가 val () 메소드가 실제로 .attr ( "value")이라는 것이 이상합니다. 왜 두 가지 방법이 있는지 궁금합니다. 나에게 .val ()은 양식 게시 필드의 값입니다.
BillRob 2009

2
@BillRob-jQuery는 실제 요소로 이동하여 직접 수행하지 않고 값을 얻는 방법을 단순화하고 표준화합니다.
James Black

때로는 ID가있는 복잡한 선택기와 부모-자식 시나리오가 필요하며 한 줄의 코드로 jQuery를 통해 얻을 수 있지만 document.getElementById를 사용하는 데 하루가 걸릴 수 있습니다. 라이브러리를 혼합하는 것은 좋지 않은 생각이지만 가끔 발생하며 jquery 객체에서 DOM 요소를 가져 오는 작업은 특히 어렵습니다. 특히 .get (0)에서는 브라우저 호환성이 없습니다.
Slavo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.