Bir elemanın bir ebeveynin çocuğu olup olmadığını kontrol edin


115

Takip koduna sahibim.

<html>
<head>
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
</head>

<div id="hello">Hello <div>Child-Of-Hello</div></div>
<br />
<div id="goodbye">Goodbye <div>Child-Of-Goodbye</div></div>

<script type="text/javascript">
<!--
function fun(evt) {
    var target = $(evt.target);    
    if ($('div#hello').parents(target).length) {
        alert('Your clicked element is having div#hello as parent');
    }
}
$(document).bind('click', fun);
-->
</script>

</html>

Yalnızca Child-Of-Hellotıklandığında bekliyorum , $('div#hello').parents(target).length> 0 döndürür.

Ancak, herhangi bir yere tıkladığımda oluyor.

Kodumda bir sorun mu var?

Yanıtlar:


160

Yalnızca doğrudan ebeveynle ilgileniyorsanız ve diğer atalarla ilgilenmiyorsanız, sadece kullanabilir parent()ve seçiciyi olarak verebilirsiniz target.parent('div#hello').

Örnek: http://jsfiddle.net/6BX9n/

function fun(evt) {
    var target = $(evt.target);    
    if (target.parent('div#hello').length) {
        alert('Your clicked element is having div#hello as parent');
    }
}

Veya eşleşen atalar olup olmadığını kontrol etmek istiyorsanız, o zaman kullanın .parents().

Örnek: http://jsfiddle.net/6BX9n/1/

function fun(evt) {
    var target = $(evt.target);    
    if (target.parents('div#hello').length) {
        alert('Your clicked element is having div#hello as parent');
    }
}

19
jquery olmadan nasıl yapılır?
SuperUberDuper

60

.has()bu amaç için tasarlanmış gibi görünüyor. Bir jQuery nesnesi döndürdüğü için, şunları da test etmelisiniz .length:

if ($('div#hello').has(target).length) {
   alert('Target is a child of #hello');
}

@redanimalwar Sağ; bu yaptığı şey bu. Ana öğeyi bulup targetiçinde olup olmadığını kontrol edin .
Blazemonger

22

IE8 + için 1 astarlı vanilya:

parent !== child && parent.contains(child);

İşte nasıl çalışıyor:

function contains(parent, child) {
  return parent !== child && parent.contains(child);
}

var parentEl = document.querySelector('#parent'),
    childEl = document.querySelector('#child')
    
if (contains(parentEl, childEl)) {
  document.querySelector('#result').innerText = 'I confirm, that child is within parent el';
}

if (!contains(childEl, parentEl)) {
  document.querySelector('#result').innerText += ' and parent is not within child';
}
<div id="parent">
  <div>
    <table>
      <tr>
        <td><span id="child"></span></td>
      </tr>
    </table>
  </div>
</div>
<div id="result"></div>


Teşekkürler, bu oldukça harika! Özyineleme harika. Fonksiyonun argümanının, fonksiyonun üzerinde çalıştığı nesnenin (içinde) nasıl olduğunu merak ediyorum. Bununla ilgili daha fazla bilgi için bir bağlantınız olabilir mi?
JohnK

20

Belirli bir seçiciye sahip olmayan bir öğeniz varsa ve yine de başka bir öğenin soyundan gelip gelmediğini kontrol etmek istiyorsanız, jQuery.contains () öğesini kullanabilirsiniz.

jQuery.contains (kapsayıcı, içerilen)
Açıklama: Bir DOM öğesinin başka bir DOM öğesinin soyundan gelip gelmediğini kontrol edin.

Kontrol etmek istediğiniz ana öğeyi ve öğeyi bu işleve aktarabilirsiniz ve ikincisi ilkinin soyundan gelirse geri döner.


3
JQuery örneklerini değil , $.containsDOM öğelerini almaya özellikle dikkat edin , aksi takdirde her zaman yanlış döndürür.
aleclarson

Hatırlanması gereken başka bir ayrıntı: $.containsİki bağımsız değişken aynı öğeyse asla doğru döndürmez. Eğer bunu istiyorsan kullan domElement.contains(domElement).
aleclarson

9

Bunun yerine .closest () kullanılarak sona erdi.

$(document).on("click", function (event) {
    if($(event.target).closest(".CustomControllerMainDiv").length == 1)
    alert('element is a child of the custom controller')
});

3

Sadece iki terimi değiştirerek kodunuzun çalışmasını sağlayabilirsiniz:

if ($(target).parents('div#hello').length) {

Çocuğu ve ebeveyni yanlış yoldan çevirdiniz.


2
var target = $(evt.target);bu nedenle kodunuz okunmalı if (target.parents('div#hello').length) {ve olmamalıdır...$(target)...
Peter Ajtai

0

Diğer cevaplara ek olarak, bu daha az bilinen yöntemi, belirli bir ebeveynin aşağıdaki gibi öğelerini almak için kullanabilirsiniz,

$('child', 'parent');

Senin durumunda, bu olurdu

if ($(event.target, 'div#hello')[0]) console.log(`${event.target.tagName} is an offspring of div#hello`);

Çocuk ve ebeveyn arasında virgül ve bunların ayrı tırnak işaretlerinin kullanıldığına dikkat edin. Aynı alıntılarla çevrelenmişlerse

$('child, parent');

belge ağaçlarında bulunup bulunmadığına bakılmaksızın, her iki nesneyi de içeren bir nesneniz olur.


Bu harika bir hack, ancak kimlikleri veya sınıfları olmayan öğelerle iyi çalışmıyor
aln447
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.