jQuery 요소가 DOM에 있는지 어떻게 확인합니까?


147

요소를 정의한다고 가정 해 봅시다.

$foo = $('#foo');

그런 다음 전화

$foo.remove()

어떤 이벤트에서. 내 질문은 $ foo가 DOM에서 제거되었는지 여부를 어떻게 확인합니까? 나는 그것이 $foo.is(':hidden')효과 가 있음을 발견 했지만, 내가 단순히 전화하면 사실을 반환합니다 $foo.hide().

답변:


238

이처럼 :

if (!jQuery.contains(document, $foo[0])) {
    //Element is detached
}

요소의 부모 중 하나가 제거 된 경우에도 여전히 작동합니다 (이 경우 요소 자체에는 여전히 부모가 있음).


14
$foo.closest(document.documentElement)이 더 빠릅니다 (누군가 jsperf.com/jquery-element-in-dom에 관심이있는 경우 )
urraka

48
@ PerroAzul : 훨씬 빠른 대안을 찾았습니다 : jsperf.com/jquery-element-in-dom/2
SLaks

3
벤치 마크 @SLaks를 연결해 주셔서 감사합니다. $.contains(document.documentElement, $foo.get(0))가장 빠른 방법 인 것 같습니다 .
Christof

10
이 작업을 수행하는 순수한 DOM 방법이 있습니다. 문법적으로 더 읽기 쉽고 성능 측면에서 매우 유사하다고 생각합니다.document.contains($foo[0])
Joel Cross

3
이 모든 성능 이야기 ...? 벤치 마크는 15 마이크로 초가 걸리는 방법과 0.15 마이크로 초가 걸리는 방법을 보여줍니다. 그러나 실제로 누가 신경 써야합니까? 십억 번하지 않으면 어떤 차이도 느끼지 못할 것입니다. jQuery 또는 JavaScript 엔진이 최적화되면 모든 것이 변경 될 수 있습니다.
제임스


5

방금 질문을 입력하면서 답변을 깨달았습니다.

$foo.parent()

$f00DOM에서 제거 된 경우 $foo.parent().length === 0. 그렇지 않으면 길이는 1 이상입니다.

[편집 : 제거 된 요소가 여전히 부모를 가질 수 있기 때문에 이것은 완전히 정확하지 않습니다. 예를 들어,를 제거해도 <ul>각 하위 <li>에는 여전히 부모가 있습니다. 대신 SLaks의 답변을 사용하십시오.


2
... 제거 된 노드가 유일한 자녀가 아닌 경우
Álvaro González 2016.

@ Álvaro-왜 중요한가요?
user113716

@ 패트릭 : 내가 뭔가를 그리워 했습니까? $ foo.parent (). length가 0보다 큰 경우 어떻게 할 수 있습니까?
Álvaro González

@ Álvaro-OP가 $fooDOM에서 제거 되었는지 테스트 중 입니다. 성공적으로 제거되면 더 이상 상위 요소가 없습니다. 따라서 $foo.parent().length === 0제거가 완료되었음을 의미합니다.
user113716

1
$ foo.closest ( "body")는이 기술에 대한 해결책이 될 것입니다
georgephillips

4

코멘트로 응답 할 수 없기 때문에 (너무 낮은 업장이라고 생각합니다) 여기 전체 답변이 있습니다. 가장 빠른 방법은 브라우저 지원을 위해 jQuery 검사를 쉽게 풀고 상수 요소를 최소로 줄이는 것입니다.

http://jsperf.com/jquery-element-in-dom/28- 여기에서도 볼 수 있듯이 코드는 다음과 같습니다.

var isElementInDOM = (function($) {
  var docElt = document.documentElement, find,
      contains = docElt.contains ?
        function(elt) { return docElt.contains(elt); } :

        docElt.compareDocumentPosition ?
          function(elt) {
            return docElt.compareDocumentPosition(elt) & 16;
          } :
          ((find = function(elt) {
              return elt && (elt == docElt || find(elt.parentNode));
           }), function(elt) { return find(elt); });

  return function(elt) {
    return !!(elt && ((elt = elt.parent) == docElt || contains(elt)));
  };
})(jQuery);

이것은 의미 적으로 jQuery.contains (document.documentElement, elt [0])와 동일합니다.


3

아마도 가장 성능이 좋은 방법은 다음과 같습니다.

document.contains(node); // boolean

이것은 jQuery 와도 작동합니다.

document.contains($element[0]); // var $element = $("#some-element")
document.contains(this[0]); // in contexts like $.each(), `this` is the jQ object

MDN 소스

노트 :


아무도이 답변을 어떻게 보았습니까? 위대한 답변 +1 (판을 고마워했습니다)
Guilherme Nascimento

1

나는이 접근법을 좋아했다. jQuery와 DOM 검색이 없습니다. 먼저 상위 부모 (조상)를 찾으십시오. 그런 다음 documentElement인지 확인하십시오.

function ancestor(HTMLobj){
  while(HTMLobj.parentElement){HTMLobj=HTMLobj.parentElement}
  return HTMLobj;
}
function inTheDOM(obj){
  return ancestor(obj)===document.documentElement;
}

1

부모를 반복하는 대신 요소가 dom에서 분리 될 때 경계 0을 얻을 수 있습니다.

function isInDOM(element) {
    var rect=element.getBoundingClientRect();
    return (rect.top || rect.bottom || rect.height || rect.width)?true:false;
}

너비가 0 인 요소와 너비가 0 인 요소의 가장자리를 0에서 왼쪽으로 처리하려면 부모가 문서까지 반복하여 두 번 확인할 수 있습니다.


이 코드 스 니펫은 문제를 해결할 수 있지만 질문에 왜 또는 어떻게 대답하는지는 설명하지 않습니다. 제발 코드에 대한 설명을 포함 하는 정말 귀하의 게시물의 품질을 개선하는 데 도움으로. 앞으로 독자들에게 질문에 대한 답변을 제공하므로 해당 사람들이 코드 제안의 이유를 모를 수도 있습니다. 신고자 / 검토 자 : 이 답변과 같은 코드 전용 답변의 경우 공감하지 마십시오.
Luca Kiebel

숨겨진 요소도 "DOM에 없음"으로 인식하지 않습니까? 예를 들어 display: none경계가없는 요소
Philipp

0

Perro의 의견에 동의하십시오. 다음과 같이 수행 할 수도 있습니다.

$foo.parents().last().is(document.documentElement);

0
jQuery.fn.isInDOM = function () {
   if (this.length == 1) {
      var element = this.get(0);
      var rect = element.getBoundingClientRect();
      if (rect.top + rect.bottom + rect.width + rect.height + rect.left + rect.right == 0)
         return false;
      return true;
   }
   return false;
};

-1

왜 안돼 if( $('#foo').length === 0)...?


@stevematdavies 문제는 "주어진 선택자 문자열과 일치하는 요소가 DOM에 있는지 테스트하는 방법이 아니라"주어진 jQuery 객체의 요소가 DOM에 있는지 테스트하는 방법 ""입니다.
Trevor Burnham

@TrevorBurnham : 모든 공정성에서을 만드는 데 사용 된 선택기를 사용 $foo하여 다시 쿼리하고 다시 쿼리가 요소와 일치하는지 확인하는 것은 많은 시나리오에서 문제에 대한 실질적인 해결책으로 보입니다. jQuery와 브라우저가 특정 선택기를 최적화하는 방법 (예 : ID)으로 인해 다른 솔루션보다 더 빠를 수도 있습니다 .
Matt

@Matt $ foo는 DOM에서 분리 된 메모리의 요소 일 수 있으며 DOM에 일치하는 선택 기가있는 요소가있을 수 있습니다. 이 질문에 대한 답변을 찾는 사람들은 아마도 DOM에 있는지 여부를 확인하고 싶을 것입니다. 그런 일을하는 사람은 DOM을 쿼리하는 방법을 분명히 알고 있습니다.
TJ

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.