보이는 DOM에 요소가 있는지 어떻게 확인할 수 있습니까?


421

방법을 사용하지 않고 요소가 존재하는지 어떻게 테스트 getElementById합니까?

참조 용 라이브 데모 를 설정했습니다 . 또한 여기에 코드를 인쇄합니다.

<!DOCTYPE html>
<html>
<head>
    <script>
    var getRandomID = function (size) {
            var str = "",
                i = 0,
                chars = "0123456789abcdefghijklmnopqurstuvwxyzABCDEFGHIJKLMNOPQURSTUVWXYZ";
            while (i < size) {
                str += chars.substr(Math.floor(Math.random() * 62), 1);
                i++;
            }
            return str;
        },
        isNull = function (element) {
            var randomID = getRandomID(12),
                savedID = (element.id)? element.id : null;
            element.id = randomID;
            var foundElm = document.getElementById(randomID);
            element.removeAttribute('id');
            if (savedID !== null) {
                element.id = savedID;
            }
            return (foundElm) ? false : true;
        };
    window.onload = function () {
        var image = document.getElementById("demo");
        console.log('undefined', (typeof image === 'undefined') ? true : false); // false
        console.log('null', (image === null) ? true : false); // false
        console.log('find-by-id', isNull(image)); // false
        image.parentNode.removeChild(image);
        console.log('undefined', (typeof image === 'undefined') ? true : false); // false ~ should be true?
        console.log('null', (image === null) ? true : false); // false ~ should be true?
        console.log('find-by-id', isNull(image)); // true ~ correct but there must be a better way than this?
    };
    </script>
</head>
<body>
    <div id="demo"></div>
</body>
</html>

기본적으로 위의 코드는 요소가 변수에 저장되고 DOM에서 제거되는 것을 보여줍니다. 요소가 DOM에서 제거되었지만 변수는 처음 선언되었을 때와 같이 요소를 유지합니다. 즉, 요소 ​​자체에 대한 실시간 참조가 아니라 복제본입니다. 결과적으로 변수의 값 (요소)이 존재하는지 점검하면 예기치 않은 결과가 제공됩니다.

isNull함수는 변수에서 요소 존재를 확인하려는 시도이며 작동하지만 동일한 결과를 얻는 더 쉬운 방법이 있는지 알고 싶습니다.

추신 : 주제와 관련된 좋은 기사를 알고 있다면 JavaScript 변수가 왜 이런 식으로 작동하는지 관심이 있습니다.


18
실제로 그것은 요소 자체에 대한 실제 참조이며 더 이상 문서에는 없습니다. DOM에서 요소를 실제로 가져온 다음 모든 이벤트 핸들러 / 등이 여전히 연결된 상태로 나중에 다시 넣을 수 있기 때문에이 기능이 필요합니다. 왜 JS 변수가 그렇게 작동합니까? 그들이하지 않으면 그것은 매우 성가신 것입니다. JS는 더 이상 변수에 대한 참조가 없을 때만 변수를 삭제합니다. 이 언어는 어떤 참조가 중요하다고 생각하는지 그리고 어떤 것이 가치가 없다고 생각하는지 알 방법이 없습니다.
마크 칸

@cwolves 흥미로운. 나는 전에 여러 번 이런 문제를 겪어 본 적이 없었습니다. 사실, 현재 프로젝트에서 변경 사항을 되돌리려는 경우를 대비하여 변경하기 전에 배열에 요소를 저장합니다.
저스틴 불

1
가비지 콜렉션은 때때로 실행되며 가능한 모든 것을 삭제합니다. 대부분의 브라우저에서 꽤 거칠게 보이지만 개발자가 일부 브라우저가 다시 시작하는 데 며칠 또는 몇 주 동안 실행된다는 것을 인식함에 따라 더 나은 가비지 수집이 브라우저 성능에 필수적입니다. 웹 개발자는 더 이상 필요없는 속성 (따라서 메모리의 항목에 대한 참조)을 삭제하여 도움을 줄 수 있습니다.
RobG

2
@JustinBull은 되돌릴 요소의 사본을 저장하는 데주의하십시오. DOM 요소를 배열에 저장하면 사본이 아닌 DOM 요소에 대한 참조가 저장되므로 배열의 요소를 참조 할 때 DOM 요소에 대한 변경 사항이 반영됩니다. 자바 스크립트의 모든 객체 ( 'object'유형의 변수)의 경우입니다.
Anthony DiSanti

답변:


545

일부 사람들이 여기에 착륙하는 것 같으며 요소 가 존재 하는지 알고 싶어 합니다 (원래 질문과 조금 다릅니다).

브라우저의 선택 방법 중 하나를 사용하여 진실한 값 (일반적으로)을 확인하는 것만 큼 ​​간단 합니다.

내 요소가 있었다 예를 들어, id의를 "find-me", 나는 간단하게 사용할 수 ...

var elementExists = document.getElementById("find-me");

이것은 요소에 대한 참조를 반환하거나로 지정됩니다 null. 부울 값이 있어야하는 경우 !!메서드 호출 전에 a를 던지기 만하면 됩니다.

또한 (all living off document) 와 같은 요소를 찾기 위해 존재하는 다른 많은 방법 중 일부를 사용할 수 있습니다 .

  • querySelector()/querySelectorAll()
  • getElementsByClassName()
  • getElementsByName()

이러한 메소드 중 일부는을 반환 하므로 a 는 객체이므로 진실 이므로 속성 NodeList을 확인하십시오 .lengthNodeList


Csuwldcat은 요소가 가시적 인 DOM의 일부로 존재하는지 (원래 질문 한 것과 같이) 실제로 결정하기 위해 (이 답변에 포함 된 것처럼) 자신을 굴리는 것보다 더 나은 솔루션을 제공합니다 . 즉, DOM 요소 에서contains() 메소드 를 사용 합니다 .

당신은 그렇게 사용할 수 있습니다 ...

document.body.contains(someReferenceToADomElement);

1
정확히 내가 찾던 것! 그래서 분명히 lol, 왜 그렇게 생각하지 않았습니까? 또한 변수가 왜 이런 식으로 작동하는지 설명하는 좋은 기사를 알고 있습니까?
저스틴 불

3
더 짧은 :var elementInDom = function( el ) { while ( el = el.parentNode ) if ( el === document ) return true; return false; }
bennedich

2
@ButtleButkus 실제 질문을 읽으십시오. 당신이 이해가되지 않습니다 사용되는 솔루션 getElementById() 것이다 DOM 요소에 대한 참조를 반환하거나 null, 따라서 사용 typeof(특히 우에는 ()가 정의되지 않은 경우 LHS 조건이를 던질 것 잘못된 것입니다 ReferenceError).
alex

2
아래에 게시 document.body.contains()된 것 보다 이것을 사용해야하는 이유가 있습니까?
분쇄

1
@Jonz 이전 답변 부분을 제거하고 , 가서 csuwldcat
alex

310

getElementById()가능한 경우 사용하십시오 .

또한 jQuery를 사용하여 쉽게 수행 할 수있는 방법이 있습니다.

if ($('#elementId').length > 0) {
  // Exists.
}

타사 라이브러리를 사용할 수없는 경우 기본 JavaScript 만 사용하십시오.

var element =  document.getElementById('elementId');
if (typeof(element) != 'undefined' && element != null)
{
  // Exists.
}

2
내가 작업중 인 프로젝트의 경우 라이브러리를 사용할 수 없습니다. Good-ol '패션 원시 코드 만. 해당 jQuery 메소드를 알고 있지만 jQuery 컨테이너에 래핑되지 않은 요소에서는 작동하지 않습니다. 예를 들어, $('#elementId')[0].length동일한 결과를 생성하지 않습니다.
저스틴 불

8
두 번째 코드 예제에서 복잡한 if 문에 대한 정당한 이유가 있습니까? 왜 간단하지 if (element) {}않습니까? element가 정의되지 않았거나 null 인 경우이 표현식은 false입니다. element가 DOM 요소이면 표현식은 true입니다.
kayahr

2
@kayahr 너무 복잡합니다. getElementById()반환에 spec'd되어 null그 요소를 발견하지 않은 경우 그래서 검사, truthy 반환 값은 필요한 모든 것입니다.
alex

5
나는 그것이 상식이라고 생각합니다.
Kon

8
getElementById절대 반환해서는 안됩니다 undefined. 어쨌든 element != null수표는 이것을 수거합니다.

191

Node.contains DOM API를 사용하면 페이지 (현재 DOM)에 어떤 요소가 있는지 쉽게 확인할 수 있습니다.

document.body.contains(YOUR_ELEMENT_HERE);

CROSS-BROWSER 참고 : documentInternet Explorer 의 개체에는 contains()브라우저 간 호환성을 보장 하는 방법 이 없습니다 document.body.contains(). 대신 브라우저를 사용하십시오 .


4
이것은이 문제에 대한 궁극적 인 답변 인 것 같습니다 ... MDN을 믿는다면 그 지원은 꽤 좋습니다.
분쇄

2
이것이 가장 좋은 대답입니다. 확인 만하면 document.contains()됩니다.
alex

@csuwldcat 적어도 Chrome에서는으로 작동했습니다 document.contains(document.documentElement). document이 있습니까 Node내가 말할 수있는 지금까지, 프로토 타입 체인에 ( document-> HTMLDocument-> Document-> Node)
알렉스

4
이것은 실제로 가장 좋은 대답입니다. 나중에까지 표준화 됨)-네이티브 API에 대한 단일 호출을 사용하므로 가장 빠릅니다
Jon z

2
@LeeSaxon 구문은 다음 document.body.contains([selector])과 같습니다.document.body.contains(document.getElementById('div')
iiglesiasedd

67

나는 단순히 :

if(document.getElementById("myElementId")){
    alert("Element exists");
} else {
    alert("Element does not exist");
}

그것은 나를 위해 일하고 아직 아무런 문제가 없었습니다 ...


1
이것은 원래의 질문과 관련이 없습니다. OP는 DOM 요소에 대한 참조가 보이는 DOM의 일부인지 여부를 알고 싶어합니다.
alex

16
그래도 도와주었습니다. 나는 요소 존재의 간단한 테스트를 찾고 있었다. 이것은 효과가 있었다. 감사.
khaverim

1
이 대답은 잘 작동하지만 요소에 id. 질문에 대답하는 더 나은 솔루션 요소가 보이는 DOM에 있는지 확인하는 방법은 무엇입니까? 어떤 요소를 사용하더라도 ids가 없는 요소조차도 할 수 document.body.contains(element)있습니다.
Edward

@Edward 이것은 완전히 다른 것입니다contains()
alex

나는 그것을 얻는다. 내 의견으로는 다른 답변이 더 좋고 질문에 더 적합하다고 제안했습니다.
Edward

11

parentNode 속성이 null인지 확인할 수 있습니다.

그건,

if(!myElement.parentNode)
{
    // The node is NOT in the DOM
}
else
{
    // The element is in the DOM
}

나는 이것이 오래된 질문이라는 것을 알고 있지만이 대답은 내가 찾던 질문에 대한 우아한 간단한 해결책입니다.
poby

11
@poby : 그것은 우아해 보일지 모르지만 실제로 요청 된 것을하지는 않습니다. 요소에 부모 요소가 있는지 확인합니다. 부모 요소가 연결되지 않았기 때문에 요소가 보이는 DOM에 있음을 의미하지는 않습니다.
kayahr

마지막 부모가 문서인지 확인하려면 부모의 모든 부모를 거쳐야합니다. 다른 문제는 여전히 여러 가지 이유로 가시 범위를 벗어 났거나 가리거나 보이지 않을 수 있다는 것입니다.
Arek Bal

요소는 문서 조각에 추가되어서 만 parentNode를 가질 수 있습니다.

11

에서 모질라 개발자 네트워크 :

이 함수는 요소가 페이지 본문에 있는지 확인합니다. contains ()가 포함되어 있고 본문에 자체가 포함되어 있는지 확인하는 것이 isInPage의 의도가 아니기 때문에이 경우 명시 적으로 false를 반환합니다.

function isInPage(node) {
  return (node === document.body) ? false : document.body.contains(node);
}

node 는 <body>에서 확인하려는 노드 입니다.


+1, (임의의) 텍스트 노드 (또는 주석 노드)에서도 작동합니까?
Nikos M.

@NikosM. html 태그에서 작동하지만 테스트하지 않았습니다.
Ekramul Hoque

4
는 안 falsetrue?
Marc-André Lafortune

nodeIS 인 경우 document.body반드시 메소드가 반환해야 true합니까? 즉,return (node === document.body) || document.body.contains(node);
daiscog

7

가장 쉬운 해결책은 baseURI 속성 을 확인하는 것 입니다.이 속성은 요소가 DOM에 삽입 될 때만 설정되며 제거 될 때 빈 문자열로 되돌아갑니다.

var div = document.querySelector('div');

// "div" is in the DOM, so should print a string
console.log(div.baseURI);

// Remove "div" from the DOM
document.body.removeChild(div);

// Should print an empty string
console.log(div.baseURI);
<div></div>


5
DOM 노드에 baseURI 속성이 있다는 것을 몰랐습니다. 이 접근법에서 내가 좋아하는 것은 요소 자체의 속성을 사용한다는 것입니다. 요소가 다른 문서 (예 : iframe)에 있어도 작동한다는 것을 의미합니다. 내가 마음에 들지 않는 점은 웹킷 외부에서 작동하지 않는 것입니다.
DoctorDestructo

요소가 문서에없는 경우 다음 오류가 발생하므로주의하십시오 Cannot read property 'baseURI' of null.. 예 :console.log(document.querySelector('aside').baseURI)
Ian Davis

이 방법은 항상 현재와 동일한 문자열을 인쇄하므로 사용할 수 없습니다.
Kagami Sascha Rosylight

4

jQuery 솔루션 :

if ($('#elementId').length) {
    // element exists, do something...
}

이것은 jQuery를 사용하여 저에게 효과적이며 사용하지 않아도 $('#elementId')[0]됩니다.


$('#elementId')[0]피해야 할 이유는 무엇입니까?
alex

오래 전에이 질문에 답 했으므로 $ ( '# elementId') [0]을 사용하여 항상 값이 0 번째 인덱스임을 나타낼 것이라고 생각합니다. 이렇게하면 항상 첫 번째 발생 요소를 확인합니다. 라디오 버튼처럼 이름이 같은 여러 개의 확인란이 있습니까? 그때 .length가 도움이 될 것입니다.
코드 버스터

3

csuwldcat의 솔루션 은 가장 좋은 것으로 보이지만 iframe과 같이 JavaScript 코드와 다른 문서에있는 요소에서 올바르게 작동하려면 약간 수정해야합니다.

YOUR_ELEMENT.ownerDocument.body.contains(YOUR_ELEMENT);

ownerDocument일반 document요소 (요소의 소유자 문서를 참조하거나 참조하지 않을 수 있음) 와 달리 요소의 속성 사용에 유의 하십시오.

torazaburo는 로컬이 아닌 요소에서도 작동 하는 더 간단한 방법 을 게시 했지만 불행히도 baseURI현재 브라우저에서 균일하게 구현되지 않은 속성을 사용합니다 ( WebKit 기반 에서만 작동 할 수 있음 ). 비슷한 방식으로 사용할 수있는 다른 요소 또는 노드 속성을 찾을 수 없으므로 위의 해결책 인 한해가 좋은 것 같습니다.


3

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

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

너비가 0 인 요소와 너비가 0 인 요소의 가장자리를 0과 왼쪽으로 처리하려는 경우 부모와 부모가 document.body .

function isInDOM(element) {
    if (!element)
        return false;
    var rect = element.getBoundingClientRect();
    if (element.top || element.left || element.height || element.width)
        return true;
    while(element) {
        if (element == document.body)
            return true;
        element = element.parentNode;
    }
    return false;
}


3

jQuery의 한 줄 코드를 통해 요소가 존재하는지 확인하는 간단한 방법을 수행 할 수 있습니다.

아래 코드는 다음과 같습니다.

if ($('#elementId').length > 0) {
    // Do stuff here if the element exists
} else {
    // Do stuff here if the element does not exist
}


2

이 코드는 저에게 효과적이며 아무런 문제가 없었습니다.


    if(document.getElementById("mySPAN")) {
        // If the element exists, execute this code
        alert("Element exists");
    }
    else {
        // If the element does not exist execute this code
        alert("Element does not exists");
    }

1

jQuery.contains요소가 다른 요소의 자손인지 확인하는을 사용할 수도 있습니다 . documentDOM 페이지에 존재하는 요소가의 자손이므로 검색하기 위해 부모 요소로 전달되었습니다 document.

jQuery.contains( document, YOUR_ELEMENT)

1

요소가 <html>via 의 자식인지 확인하십시오 Node::contains().

const div = document.createElement('div');
document.documentElement.contains(div); //-> false

document.body.appendChild(div);
document.documentElement.contains(div); //-> true

나는이 덮여 및 더 많은 것 입니다-DOM의 주택 .


1

jQuery를 사용한 간단한 솔루션 :

$('body').find(yourElement)[0] != null

2
... 또는$(document).find(yourElement).length !== 0
Grinn

1
이것은 그것을 이용합니다 null == undefined. 실제 반환 값은입니다 undefined. 그것을 비교하는 null것은 약간 이상합니다.
alex

1
// This will work prefectly in all :D
function basedInDocument(el) {

    // This function is used for checking if this element in the real DOM
    while (el.parentElement != null) {
        if (el.parentElement == document.body) {
            return true;
        }
        el = el.parentElement; // For checking the parent of.
    } // If the loop breaks, it will return false, meaning
      // the element is not in the real DOM.

    return false;
}

모든 것에서? 모든 경우?
Peter Mortensen

1
  • 요소가에 있으면 DOM해당 부모도
  • 그리고 마지막 조부모는 document

parentNode마지막 조부모에 도달 할 때까지 요소의 트리에 루프를 반복하는지 확인

이것을 사용하십시오 :

/**
 * @param {HTMLElement} element - The element to check
 * @param {boolean}     inBody  - Checks if the element is in the body
 * @return {boolean}
 */
var isInDOM = function(element, inBody) {
    var _ = element, last;

    while (_) {
        last = _;
        if (inBody && last === document.body) { break;}
        _ = _.parentNode;
    }

    return inBody ? last === document.body : last === document;
};

2
이것은 DOM에서 다시 렌더링하지 않기 때문에 가장 좋은 대답 일 수 있습니다.
Steven Vachon 2016 년

설명은 순서대로 이루어집니다 ( 주석이 아닌 답변편집하여 응답 ).
피터 Mortensen

0

나는이 접근법을 좋아했다.

var elem = document.getElementById('elementID');

if (elem)
    do this
else
    do that

또한

var elem = ((document.getElementById('elemID')) ? true:false);

if (elem)
    do this
else
    do that

1
!!부울을 원한다면 왜 안 됩니까?
alex

따라서 요소에 ID가 없으면 DOM에없는 것으로 간주됩니까? 나는 이것이 틀렸다고 말하고 싶다.
Steven Vachon 2016 년

0

querySelectorAll와 함께 사용 forEach,

document.querySelectorAll('.my-element').forEach((element) => {
  element.classList.add('new-class');
});

반대로 :

const myElement = document.querySelector('.my-element');
if (myElement) {
  element.classList.add('new-class');
}

0

다음을 시도하십시오. 가장 안정적인 솔루션입니다.

window.getComputedStyle(x).display == ""

예를 들어

var x = document.createElement("html")
var y = document.createElement("body")
var z = document.createElement("div")
x.appendChild(y);
y.appendChild(z);

z.style.display = "block";

console.log(z.closest("html") == null); // 'false'
console.log(z.style.display); // 'block'
console.log(window.getComputedStyle(z).display == ""); // 'true'

1
: 이것은 가능성이 다시 배치됩니다 gist.github.com/paulirish/5d52fb081b3570c81e3a#getcomputedstyle
스티븐 바샹

0

HTML 요소를 제외한 모든 기존 요소에는 parentElement가 설정되어 있습니다!

function elExists (e) { 
    return (e.nodeName === 'HTML' || e.parentElement !== null);
};

항상 "HTML" 입니까? 그것은 될 수 있을까 "HTML" ?
Peter Mortensen

x.tagName 또는 x.nodeName은 항상 대문자로 코드에 작성하는 방법에 상관없이
Jonah

0

이 상태는 모든 경우에 영향을 미칩니다.

function del() {
//chick if dom has this element 
//if not true condition means null or undifind or false .

if (!document.querySelector("#ul_list ")===true){

// msg to user
    alert("click btn load ");

// if console chick for you and show null clear console.
    console.clear();

// the function will stop.
    return false;
}

// if its true function will log delet .
console.log("delet");

}


0

node.isConnected속성을 선호 합니다 ( MDN 방문) )을 .

참고 : 요소가 ShadowRoot에 추가 된 경우 true를 반환합니다. 이는 모든 사람이 원하는 행동이 아닐 수도 있습니다.

예:

const element = document.createElement('div');
console.log(element.isConnected); // Returns false
document.body.append(element);
console.log(element.isConnected); // Returns true
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.