보이는 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
는 안 false될 true?
— 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.