Öğeyi sınıf ve kimliğe göre öğenin içine alma - JavaScript


136

Pekala, daha önce JavaScript ile uğraştım, ama yazdığım en faydalı şey bir CSS stil değiştirici. Bu yüzden biraz yeniyim. Diyelim ki böyle bir HTML kodum var:

<div id="foo">
    <div class="bar">
        Hello world!
    </div>
</div>

"Merhaba dünya!" "Güle güle dünya!" ? Document.getElementByClass ve document.getElementById'in nasıl çalıştığını biliyorum, ancak daha spesifik olmak istiyorum. Daha önce sorulmuşsa özür dilerim.

Yanıtlar:


233

İlk olarak, gibi bir işleve sahip öğeleri seçmeniz gerekir getElementById.

var targetDiv = document.getElementById("foo").getElementsByClassName("bar")[0];

getElementByIdyalnızca bir düğüm döndürür, ancak getElementsByClassNamebir düğüm listesi döndürür. Bu sınıf adına sahip tek bir öğe olduğu için (anlatabildiğim kadarıyla), ilkini alabilirsin (bunun için ne [0]var - tıpkı bir dizi gibi).

Ardından, html'yi ile değiştirebilirsiniz .textContent.

targetDiv.textContent = "Goodbye world!";

var targetDiv = document.getElementById("foo").getElementsByClassName("bar")[0];
targetDiv.textContent = "Goodbye world!";
<div id="foo">
    <div class="bar">
        Hello world!
    </div>
</div>


1
Ebeveynin kimliğe göre alınması bu durumda gerekli değildir. document.getElementsByClassNameiyi çalışır.
rvighne

7
@ rvighne OP'nin kesin gereklilikleri "daha spesifik olmak istiyordu" idi. Soruyu soran kişi, DOM ağacı geçişinde nasıl daha spesifik olabileceğini soruyordu. GetElementByClassName kullanımı bir karışıklık noktası değildi, ancak birisinin her ikisini de gerektiği gibi gösterdiğimi nasıl kolayca düşündüğünü görebiliyorum. Onlar değil. Belirli bir sınıfın yalnızca belirli bir sınıfın belirli bir düğümü altındaki öğeleri, farklı bir düğüm altındaki aynı sınıfın öğelerinin aksine hedeflemek istiyorsanız, bunu kullanırsınız.
Joseph Marikle

1
Bu cevabı düzenlemek ve kopyala / yapıştır kodlayıcılarının güvenlik yararına .innerHtmlgeçmek .textContentiçin iyi olabilir .
codescribblr

14

Bunu şu şekilde yapabilirsiniz:

var list = document.getElementById("foo").getElementsByClassName("bar");
if (list && list.length > 0) {
    list[0].innerHTML = "Goodbye world!";
}

veya daha az hata kontrolü ve daha fazla kısalık ile yapmak istiyorsanız, böyle bir satırda yapılabilir:

document.getElementById("foo").getElementsByClassName("bar")[0].innerHTML = "Goodbye world!";

Açıklama:

  1. Elemanı alıyorsunuz id="foo".
  2. Daha sonra, o nesnenin içinde bulunan nesneleri bulursunuz class="bar".
  3. Bu, dizi benzeri bir nodeList döndürür, böylece bu nodeList içindeki ilk öğeye başvurursunuz
  4. Daha sonra innerHTMLiçeriğini değiştirmek için o öğeyi ayarlayabilirsiniz .

Uyarılar: bazı eski tarayıcılar desteklemez getElementsByClassName(örneğin eski IE sürümleri). Bu işlev eksikse yerine yerleştirilebilir.


Burası, tarayıcı uyumluluğu hakkında endişelenmek yerine yerleşik CSS3 seçici desteğine sahip bir kütüphane kullanmanızı öneririm (bir başkasının tüm işi yapmasına izin verin). Bunu yapmak için sadece bir kütüphane istiyorsanız, Sizzle harika çalışır. Sizzle'de bu şu şekilde yapılır:

Sizzle("#foo .bar")[0].innerHTML = "Goodbye world!";

jQuery yerleşik Sizzle kütüphanesi vardır ve jQuery, bu olurdu:

$("#foo .bar").html("Goodbye world!");

Teşekkür ederim, document.getElementBy * ile ilgili sorun yaşıyordum. jQuery işleri çok daha kolay hale getirir.
Tanner Babcock

7

Bunun IE 7 veya daha düşük sürümlerde çalışması gerekiyorsa, getElementsByClassName öğesinin tüm tarayıcılarda bulunmadığını hatırlamanız gerekir. Bu nedenle kendi getElementsByClassName'inizi oluşturabilir veya bunu deneyebilirsiniz.

var fooDiv = document.getElementById("foo");

for (var i = 0, childNode; i <= fooDiv.childNodes.length; i ++) {
    childNode = fooDiv.childNodes[i];
    if (/bar/.test(childNode.className)) {
        childNode.innerHTML = "Goodbye world!";
    }
}

getElementsByClassNameIE8'de de çalışmaz, ancak querySelectorAllonun yerine kullanabilirsiniz (hemen hemen).
user113716

@ Ӫ _._ Ӫ ... lol ... haklısın ama cevabımı daha da kanıtlarsın. Sayfanızın birden çok tarayıcıda çalışması gerekiyorsa getElementsByClassName öğesine güvenemezsiniz. jQuery kesinlikle bir seçenek olurdu ama yukarıdaki kod whould.
John Hartsock

Evet, cevabınızı desteklemek için bu yorumu kastetmiştim, ancak qSAyine de IE8'de yerel kodu kullanabilmeniz için bir şim içinde kullanmanın mümkün olduğuna işaret etmek . Çözümünüze daha yakından bakmanıza rağmen, düzeltilmesi gereken birkaç şey var.
user113716

@ Ӫ _._ Ӫ ... ne görüyorsun merak ediyorum ... çünkü görmüyorum.
John Hartsock

var i = 0, var child = fooDiv.childNodes[i]geçersizdir. i <= fooDiv.childNodesgerçekten mantıklı değil. Değişken childNode.className.test("bar")yoktur childNodeve dizenin bir test()yöntemi yoktur.
user113716

4

Özyinelemeli işlev:

function getElementInsideElement(baseElement, wantedElementID) {
    var elementToReturn;
    for (var i = 0; i < baseElement.childNodes.length; i++) {
        elementToReturn = baseElement.childNodes[i];
        if (elementToReturn.id == wantedElementID) {
            return elementToReturn;
        } else {
            return getElementInsideElement(elementToReturn, wantedElementID);
        }
    }
}

Yukarıdaki örnekte küçük bir hata var. Anında başka bir yola dönmek yerine, önce bir şey bulunup bulunmadığını kontrol etmelisiniz. Aksi takdirde, diğer alt düğümler arasında geçiş yapılmaz. Bunun gibi bir şey: if (elementToReturn) {return elementToReturn; }
Jannik

3

Bunu yapmanın en kolay yolu:

function findChild(idOfElement, idOfChild){
  let element = document.getElementById(idOfElement);
  return element.querySelector('[id=' + idOfChild + ']');
}

veya daha iyi okunabilir:

findChild = (idOfElement, idOfChild) => {
    let element = document.getElementById(idOfElement);
    return element.querySelector(`[id=${idOfChild}]`);
}

-4

Kullanılan olmamalıdır document.getElementById sadece istemci tarafı denetimleri için çalışma kimlikleri tespit edildiği çünkü. Aşağıdaki örnekte olduğu gibi jquery kullanmalısınız.

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>                                                                                                             
<div id="foo">
   <div class="bar"> 
          Hello world!
     </div>
</div>

bunu kullan :

$("[id^='foo']").find("[class^='bar']")

// do not forget to add script tags as above

Herhangi bir kaldırmak herhangi bir işlemi düzenlemek istiyorsanız sadece "." arkasında ve işlemleri yapmak


10
Bir geyiği öldürmek için termonükleer bir silah kullanmak işe yarayacaktır, ancak hafifçe aşırı silahlıdır. Javascript temel kodundaki işlevsellik biraz daha fazla abartıldığında bir öğe seçmek için multi-kb jQuery kitaplığı kullanmak.
Danejir
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.