Görünür DOM'de bir öğenin olup olmadığını nasıl kontrol edebilirim?


421

getElementByIdMetodu kullanmadan bir elementin varlığını nasıl test edersiniz ?

Ben kurdunuz canlı demo başvuru için. Ayrıca kodu da burada yazdıracağım:

<!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>

Temel olarak yukarıdaki kod, bir değişkende saklanan ve daha sonra DOM'dan kaldırılan bir öğeyi gösterir. Öğe DOM'dan kaldırılmış olsa da, değişken öğeyi ilk bildirildiği gibi korur. Başka bir deyişle, öğenin kendisine canlı bir referans değil, bir kopyadır. Sonuç olarak, değişkenin değerinin (öğe) varlığını kontrol etmek beklenmedik bir sonuç sağlayacaktır.

isNullİşlevi, bir değişkene bir element varlığını denetlemek için benim girişimi olduğunu ve çalışıyor, ama aynı sonucu başarmak için daha kolay bir yol olup olmadığını bilmek istiyorum.

Not: Konuyla ilgili iyi makaleler bilen biri varsa, JavaScript değişkenlerinin neden böyle davrandığıyla da ilgileniyorum.


18
Aslında, öğenin kendisine canlı bir referans, artık bir belgede değil. Bu işlevsellik gereklidir, çünkü bir öğeyi gerçekten DOM'dan çıkarabilir ve daha sonra tüm olay işleyicileri / vb. JS değişkenleri neden böyle davranıyor? Çünkü olmasaydı inanılmaz derecede can sıkıcı olurdu. JS yalnızca değişkenlere artık HERHANGİ referansınız olmadığında siler. Dilin hangi referansları önemli bulduğunuzu ve hangilerinin değersiz olduğunu bilmenin hiçbir yolu yoktur.
Mark Kahn

@cwolves İlginç. Bunu daha önce birçok kez karşılaştım ve gerçekten çok fazla düşünmedim. Aslında, şu anki projemde, değişiklikleri geri almak istemem durumunda, onları herhangi bir değişiklik yapmadan önce bir dizideki öğeleri kaydediyorum.
Justin Bull

1
Çöp toplama zaman zaman çalışır ve düşündüğü her şeyi siler. Çoğu tarayıcıda oldukça berbat görünüyor, ancak geliştiricilerin bazı tarayıcıların yeniden başlatmalar arasında günler veya haftalar boyunca çalıştığını fark ettikleri için daha iyi hale geliyor, bu nedenle tarayıcı performansı için iyi çöp toplama çok önemlidir. Web geliştiricileri, artık gerekli olmayan özellikleri (ve dolayısıyla bellekteki şeylere referansları) silerek yardımcı olabilir.
RobG

2
@JustinBull, geri döndürülecek öğelerin kopyalarını saklarken dikkatli olun. Bir DOM öğesini bir dizide saklarken, kopyaya değil DOM öğesine bir referans kaydedilir; bu nedenle, DOM öğesine yapılan değişiklikler, dizinin öğesine başvururken yansıtılır. Javascript içindeki tüm nesneler için bu durum geçerlidir ('object' türündeki değişkenler).
Anthony DiSanti

Yanıtlar:


545

Bazı insanlar buraya iniyor ve sadece bir elementin var olup olmadığını bilmek istiyorlar (orijinal sorudan biraz farklı).

Bu, tarayıcının seçme yöntemlerinden herhangi birini kullanmak ve bunu doğruluk değeri (genellikle) için kontrol etmek kadar basittir .

Örneğin, öğemin bir iddeğeri varsa "find-me", sadece ...

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

Bu, öğeye bir başvuru döndürmek için belirtilir veya null. Bir Boole değerine sahip olmanız gerekiyorsa !!, yöntem çağrısından önce a'yı atmanız yeterlidir .

Ek olarak, (hepsi yaşamak document) gibi öğeler bulmak için var olan diğer birçok yöntemden bazılarını kullanabilirsiniz :

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

Bu yöntemlerden bazıları a döndürür NodeList, bu nedenle lengthözelliğini kontrol ettiğinizden emin olun , çünkü a NodeListbir nesnedir ve bu nedenle doğrudur .


Bir öğenin görünür DOM'nin bir parçası olarak (orijinal olarak sorulan soru gibi) var olup olmadığını gerçekten belirlemek için, Csuwldcat kendi yuvarlanmanızdan daha iyi bir çözüm sunar (bu cevap eskiden olduğu gibi). Olduğu, kullanım açısından DOM elemanları üzerinde bir yöntem.contains()

Bu şekilde kullanabilirsiniz ...

document.body.contains(someReferenceToADomElement);

1
Tam olarak ne aradım! Açıkçası lol, neden bunu düşünmedim. Ayrıca, değişkenlerin neden böyle davrandığını açıklayan iyi makaleler biliyor musunuz?
Justin Bull

3
Daha da kısa:var elementInDom = function( el ) { while ( el = el.parentNode ) if ( el === document ) return true; return false; }
bennedich

2
@ButtleButkus Asıl soruyu okuyun. Gibi mantıklı değil kullanılan Bu çözüm getElementById() olacak bir DOM öğesine bir başvuru döndürür veya nullbu nedenle kullanarak typeof(özellikle rhs) (o tanımlı olmasaydı, LHS koşul atmak istiyorum yanlıştır ReferenceError).
alex

2
Bunu aşağıda yayınlananlar üzerinde kullanmak için herhangi bir neden var mı: document.body.contains()hangisinin tarayıcı desteği çok iyi görünüyor?
ezmek

1
@Jonz Eski cevap bölümünü kaldırdı, gitmeyi ve oy vermeyi unutma
alex

310

getElementById()Varsa kullanın .

Ayrıca, jQuery ile yapmanın kolay bir yolu:

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

Üçüncü taraf kitaplıkları kullanamıyorsanız, JavaScript'i temel almanız yeterlidir:

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

2
Üzerinde çalıştığım proje için kütüphane kullanamıyorum. Sadece moda ham kodu. Bu jQuery yönteminin farkındayım, ancak jQuery kapsayıcısına sarılmamış öğeler üzerinde çalışmıyor. Örneğin $('#elementId')[0].length, aynı sonucu vermeyecektir.
Justin Bull

8
İkinci kod örneğinde bu kadar karmaşık bir if ifadesinin iyi bir nedeni var mı? Neden basit değil if (element) {}? Öğe tanımsız veya null olduğunda bu ifade false olur. Öğe bir DOM öğesiyse, ifade true olur.
kayahr

2
@kayahr Çok karmaşık. öğeyi bulamadıysa getElementById()geri dönmesi nullgerekir, bu yüzden doğru bir döndürülen değeri kontrol etmek yeterlidir .
alex

5
Bence bu sadece sağduyu.
Kon

8
getElementByIdasla geri dönmemeli undefined. Her durumda, element != nullçek bunu alacaktır.

191

Node.con DOM DOM kullanarak, sayfadaki herhangi bir öğenin (şu anda DOM'da) var olup olmadığını kolayca kontrol edebilirsiniz:

document.body.contains(YOUR_ELEMENT_HERE);

CROSS-BROWSER NOT : documentInternet Explorer'daki nesnenin bir contains()yöntemi yoktur - tarayıcılar arası uyumluluğu sağlamak için document.body.contains()bunun yerine kullanın.


4
Bu, bu sorunun nihai cevabı gibi görünüyor ... ve MDN'ye inanılacaksa desteği oldukça iyi.
ezmek

2
Bu en iyi cevap. Sadece kontrol document.contains()etmenin yeterli olduğunu unutmayın .
alex

@csuwldcat Benim için çalıştı, en azından Chrome'da document.contains(document.documentElement). anlayabildiğim kadarıyla, prototip zincirinde documentvar Node( document-> HTMLDocument-> Document-> Node)
alex

4
Bu gerçekten en iyi cevap: - bu bir web standardı - çok iyi destekleniyor (şaşırtıcı bir şekilde 9 sürümüne kadar Firefox'ta görünmüyor, tahmin ediyorum çünkü IE'de icat edilmemiş standart olmayan bir işlevdi daha sonraya kadar standartlaştırılmıştır) - en hızlı olmalıdır çünkü yerel bir API'ya tek bir çağrı kullanır
Jon z

2
@LeeSaxon Sözdizimi document.body.contains([selector]), yanidocument.body.contains(document.getElementById('div')
iglesiasedd

67

Sadece yapıyorum:

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

Benim için çalışıyor ve onunla henüz bir sorunu yoktu ...


1
Bunun orijinal soru ile ilgisi yok. OP, bir DOM öğesine yapılan başvurunun görünür DOM'nin bir parçası olup olmadığını bilmek ister.
alex

16
Yine de bana yardımcı oldu. Basit bir element varlığı testi arıyordum; bu işe yaradı. Teşekkürler.
khaverim

1
Bu cevap iyi çalışır, ancak yalnızca bir öğeye sahip olduğunda id. Soruyu cevaplayan daha iyi bir çözüm Görünür DOM'de öğenin olup olmadığını nasıl kontrol edebilirim? herhangi bir elemanla, ids olmadan elemanlar bile yapmaktır document.body.contains(element).
Edward

@Edward Bu tamamen farklı bir şeycontains()
alex

Anladım. Yorumumda diğer cevapların daha iyi ve soruya daha uygun olduğunu öneriyordum.
Edward

11

ParentNode özelliğinin boş olup olmadığını kontrol edebilirsiniz.

Yani,

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

Bunun eski bir soru olduğunu biliyorum ama bu cevap tam olarak aradığım soruya zarif ve basit bir çözüm.
poby

11
@ poby: Zarif görünebilir ama gerçekten istenenleri yapmıyor. Yalnızca öğenin üst öğesi olup olmadığını kontrol eder. Bu, üst öğe ona bağlı olmadığından öğenin görünür DOM'de olduğu anlamına gelmez.
kayahr

Sonuncunun belge olup olmadığını öğrenmek için tüm ebeveynlerin ebeveynlerinden geçmesi gerekir. Diğer sorun, hala görünür aralığın dışında olması veya kapsanması veya diğer birçok nedenden dolayı görünmemesidir.
Arek Bal

Bir öğe, yalnızca bir belge parçasına eklenmiş olması nedeniyle bir parentNode'a da sahip olabilir.

11

Gönderen Mozilla Geliştirici Ağı :

Bu işlev, bir öğenin sayfanın gövdesinde olup olmadığını kontrol eder. İnclude () kapsayıcı olduğundan ve gövdenin kendisini içerip içermediğini belirleyen isInPage'in amacı değilse, bu durum açıkça false değerini döndürür.

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

düğüm <body> içinde kontrol etmek istediğimiz düğümdür.


+1, bu (rastgele) metin düğümleri (veya yorum düğümleri) için de geçerli mi?
Nikos

@NikosM. Herhangi bir html etiketinde çalışmalı ama test etmedim.
Ekramul Hoque

4
Gerekmiyor falseolmak true?
Marc-André Lafortune

Eğer nodeIS document.body, mutlaka yöntem dönmelidir true? Yani,return (node === document.body) || document.body.contains(node);
daiscog

7

En kolay çözüm, yalnızca öğe DOM'a eklendiğinde ayarlanan baseURI özelliğini kontrol etmektir ve kaldırıldığında boş bir dizeye geri döner.

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 düğümlerinde baseURI özelliği olduğunu bile bilmiyordum. Bu yaklaşımla ilgili sevdiğim şey, öğenin kendisinin bir özelliğini kullanmasıdır, bu da muhtemelen öğenin farklı bir belgede (örneğin bir iframe) olsa bile çalışacağı anlamına gelir. Bu konuda hoşlanmadığım şey, Webkit dışında çalışmıyor gibi görünüyor.
DoctorDestructo

Eleman belgede değilse bu kadar dikkatli takip hatası atar: Cannot read property 'baseURI' of null. Örnek:console.log(document.querySelector('aside').baseURI)
Ian Davis

Bu yöntem, şu anki dizeyi her zaman yazdırdığı için kullanılamaz.
Kagami Sascha Rosylight

4

jQuery çözümü:

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

Bu benim için jQuery kullanarak çalıştı ve $('#elementId')[0]kullanılması gerekmez .


Neden $('#elementId')[0]kaçınılması gereken bir şey var?
alex

Uzun süredir bunu cevapladım, Yani, $ ('# elementId') [0] kullanarak her zaman değerin 0th dizininde olacağını belirttiğinize inanıyorum. Bu şekilde daima 1. meydana gelen elemanı kontrol edersiniz. Bir radyo düğmesi gibi, aynı ada sahip birden fazla onay kutusu vardı. O zaman .length yardımcı olacaktır.
Code Buster

3

csuwldcat'in çözümü grubun en iyisi gibi görünüyor, ancak bir iframe gibi JavaScript kodunun çalıştığından farklı bir belgedeki bir öğeyle doğru çalışması için küçük bir değişiklik gerekiyor:

YOUR_ELEMENT.ownerDocument.body.contains(YOUR_ELEMENT);

ownerDocumentYalnızca eski özelliklerin aksine document(öğenin sahibi belgesine atıfta bulunabilir veya bulunmayabilir) , öğenin özelliğinin kullanımına dikkat edin .

torazaburo , yerel olmayan öğelerle de çalışan daha basit bir yöntem yayınladı , ancak ne yazık ki, baseURIşu anda tarayıcılar arasında düzgün bir şekilde uygulanmayan özelliği kullanıyor (yalnızca WebKit tabanlı olanlarda çalışabiliyordum ). Benzer bir şekilde kullanılabilecek başka bir eleman veya düğüm özelliği bulamadım, bu yüzden yukarıdaki çözümün o kadar iyi olduğunu düşünüyorum.


3

Ebeveynleri yinelemek yerine, öğe DOM'dan ayrıldığında tamamen sıfır olan sınırlayıcı dikdörtgeni elde edebilirsiniz:

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

Sıfır genişlik ve yükseklik öğesinin kenar kasasını sıfır üstte ve sıfırda sola taşımak istiyorsanız, ebeveynleri aşağıdakilere kadar yineleyerek kontrol edebilirsiniz 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

Bir öğenin var olup olmadığını kontrol etmenin basit bir yolu, jQuery'nin tek satırlık koduyla yapılabilir.

İşte aşağıdaki kod:

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


2

Bu kod benim için çalışıyor ve onunla herhangi bir sorun yoktu.


    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

Ayrıca jQuery.contains, bir öğenin başka bir öğenin soyundan olup olmadığını kontrol eden kullanabilirsiniz . documentAramak için üst öğe olarak geçtim çünkü DOM sayfasında var olan herhangi bir öğenin torunu document.

jQuery.contains( document, YOUR_ELEMENT)

1

Öğenin şu <html>yolla bir çocuk olup olmadığını kontrol edin Node::contains():

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

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

Bunu ve daha fazlasını is-dom-müstakil olarak ele aldım .


1

JQuery ile basit bir çözüm:

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

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

1
Bu istismar eder null == undefined. Gerçek döndürülen değer olurdu undefined. Karşılaştırma nullbiraz garip.
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;
}

Ne içinde? Tüm vakalar?
Peter Mortensen

1
  • Bir öğe DOM ebeveynleri de
  • Ve son büyükbaba veya büyükanne document

Böylece parentNodeson büyükbaba veya büyükanne veya büyükbaba

Bunu kullan:

/**
 * @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
Bu, DOM'da herhangi bir yeniden oluşturma işlemine neden olmadığından en iyi yanıt olabilir.
Steven Vachon

Bir açıklama yapılabilir ( burada yorumlarda değil cevabınızı düzenleyerek yanıtlayın ).
Peter Mortensen

0

Bu yaklaşımı beğendim:

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

if (elem)
    do this
else
    do that

Ayrıca

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

if (elem)
    do this
else
    do that

1
Neden sadece !!bir Boole istiyorsanız?
alex

Öyleyse, öğenin bir kimliği yoksa, DOM'da olmadığı düşünülür mü? Bunun yanlış olduğunu söyleyebilirim.
Steven Vachon

0

Kullan querySelectorAllile forEach,

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

tam tersi olarak:

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

0

Takip etmeyi dene. En güvenilir çözümdür:

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

Örneğin,

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
Bu muhtemelen yeniden bir düzene neden olur: gist.github.com/paulirish/5d52fb081b3570c81e3a#getcomputedstyle
Steven Vachon

0

HTML öğesi hariç, varolan tüm öğelerin parentElement kümesi vardır!

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

Her zaman "HTML" midir? O olabilir "html" ?
Peter Mortensen

x.tagName veya x.nodeName her zaman büyük harfle yazmayın, kodunuza nasıl yazacağınız
Jonah

0

bu durum her durumda piliç.

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Özelliği kullanmayı tercih ederim ( MDN'yi ziyaret edin ).

Not: Bu öğe, bir ShadowRoot'a da eklenirse, doğru olacaktır;

Misal:

const element = document.createElement('div');
console.log(element.isConnected); // Returns false
document.body.append(element);
console.log(element.isConnected); // Returns true
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.