JQuery kullanarak bir HTML öğesinin boş olup olmadığını nasıl kontrol edebilirim?


336

JQuery kullanarak bir HTML öğesi boşsa, yalnızca bir işlevi çağırmaya çalışıyorum.

Bunun gibi bir şey:

if (isEmpty($('#element'))) {
    // do something
}

$('#elem').text().match(/\S/) || alert('empty');
Thielicious

Yanıtlar:


557
if ($('#element').is(':empty')){
  //do something
}

daha fazla bilgi için bkz. http://api.jquery.com/is/ ve http://api.jquery.com/empty-selector/

DÜZENLE:

Bazılarının işaret ettiği gibi, boş bir öğenin tarayıcı yorumu değişebilir. Boşluklar ve satır kesmeleri gibi görünmez öğeleri yok saymak ve uygulamayı daha tutarlı hale getirmek istiyorsanız bir işlev oluşturabilirsiniz (veya yalnızca içindeki kodu kullanabilirsiniz).

  function isEmpty( el ){
      return !$.trim(el.html())
  }
  if (isEmpty($('#element'))) {
      // do something
  }

Bunu bir jQuery eklentisine de yapabilirsiniz, ancak fikri anlarsınız.


56
Satır kesmeleri, FF ve Chrome'daki öğelere içerik olarak kabul edilir.
Corneliu

@Corneliu doğru. Aşağıda bunu dikkate alan bir cevap gönderdim. Bu, yakın tarihli bir projede benim için büyük bir hayal kırıklığı kaynağıydı
DMTintner

2
Bu harika :-D
jasonbradberry

HTML yorumları da içerik olarak kabul edilir.
Paolo

Bunu bir işlevle yapmak elbette güzel, ama daha "gömülü" (ve biraz zorlayıcı) istiyorsanız, jQuery prototipini manipüle
etmenizi veya JQ'nun

117

Bunu tek güvenilir yol olarak buldum (Chrome ve FF, boşlukları ve satır satırlarını öğeler olarak kabul ettiğinden):

if($.trim($("selector").html())=='')

20
Biraz daha sıkıştırılmış bir versiyon, boş ipin yanlışlığından faydalanabilir: if(!$.trim($("selector").html())
Brandon Belvin

11
Onları "element" olarak gördüklerini sanmıyorum, ama IMO doğru olan düğümleri düşünüyorlar. if($("selector").children().length === 0)Ya da yapabilirsin if($("selector > *").length === 0).
panzi

1
Bence "elementleri" "düğümlerle" karıştırıyorsunuz.

1
$ ("selector"). html (). trim () === ''
kullanıcı1156544

1
Neden bilmiyorum ama bu cevap yöntemi: if ($. Trim ($ ("selector"). Html ()) == '') çalıştı. .is (': boş') olmadı!
Zeljko Miloradovic

62

Boşluk ve satır sonları kullanımdaki ana sorunlardır: boş seçici. Dikkatli olun, CSS'de: boş sözde sınıf aynı şekilde davranır. Bu yöntemi seviyorum:

if ($someElement.children().length == 0){
     someAction();
}

4
Bunu yukarıda seçtim çünkü DIV'imde HTML yorumları vardı.
Paolo

2
Şimdiye kadar en zarif çözüm, doğru cevap olmalı.
Christoffer Bubach

6
$.children()Metin veya yorum düğümleri döndürmediğini unutmayın, yani bu çözüm yalnızca öğenin öğelerin boş olup olmadığını kontrol eder . Yalnızca metin veya yorum içeren bir öğenin ihtiyaçlarınız için boş kabul edilmemesi gerekiyorsa, diğer çözümlerden birini kullanmalısınız.
18:20

@sierrasdetandil selectöğeler için mükemmel. durum da olabilir if(! $el.children().length).
CPHPython

28
!elt.hasChildNodes()

Evet, biliyorum, bu jQuery değil, bu yüzden bunu kullanabilirsiniz:

!$(elt)[0].hasChildNodes()

Şimdi mutlu?


1
+1 filterGerekmedikçe işlev içinde jQuery kullanmak istemediğim için yaklaşımınızı bir jQuery işlevi içinde kullandım.
WynandB

1
Yalnızca boşluk boş olduğunu düşünürsem <div class="results"> </div>, bu ifade false döndürür. jsfiddle.net/ytliuSVN/0pdwLt46
Penny Liu

19
jQuery.fn.doSomething = function() {
   //return something with 'this'
};

$('selector:empty').doSomething();

Harika! Ifs içermeyen yapıları severim.
Nikolay Fominyh

@Nikolay ile tamamen katılıyorum, Özel durumum için yararlı değil, ancak gelecek için hatırlayacağım!
vitto

'this' uygulamanız gerektiğinde bu işe yaramaz
Zeal Murapa

this@ZealMurapa jQuery öğesinin dışında başka ne olabilir?
AlienWebguy

12

"Boş" ile ifade ediyorsanız, HTML içeriği olmadan,

if($('#element').html() == "") {
  //call function
}

dikkat, boşluk ve satır kesmeleri html'nin == '' olmamasına neden olabilir, ancak öğe yine de boş olabilir. Başka bir çözüm için aşağıdaki yanıtı kontrol edin
DMTintner

8

İçinde olduğu gibi boş metin içermiyor mu?

if (!$('#element').text().length) {
    ...
}

Bu, içeriği resim olan öğelere hitap etmez (bununla nasıl geldiğimi sorma ...)
Kötü İstek

@BadRequest Hayır, dolayısıyla "olduğu gibi metin içermiyor mu?" :)
jensgram

7

Özgeçmişte, bir öğenin boş olup olmadığını öğrenmek için birçok seçenek vardır:

1- Kullanma html:

if (!$.trim($('p#element').html())) {
    // paragraph with id="element" is empty, your code goes here
}

2- Kullanma text:

if (!$.trim($('p#element').text())) {
    // paragraph with id="element" is empty, your code goes here
}

3- Kullanma is(':empty'):

if ($('p#element').is(':empty')) {
    // paragraph with id="element" is empty, your code goes here
}

4- Kullanma length

if (!$('p#element').length){
    // paragraph with id="element" is empty, your code goes here
}

Bağımlı olarak, bir giriş öğesinin boş olup olmadığını bulmaya çalışıyorsanız şunları kullanabilirsiniz val:

if (!$.trim($('input#element').val())) {
    // input with id="element" is empty, your code goes here
}

2

Tarayıcı için html()veya daha az "iş" gerektiren başka bir seçenek children():

function isEmpty( el ){
  return !el.has('*').length;
}

1
document.getElementById("id").innerHTML == "" || null

veya

$("element").html() == "" || null

0

Deneyebilirsin:

if($('selector').html().toString().replace(/ /g,'') == "") {
//code here
}

* Beyaz boşlukları değiştirin, sadece örtün;)


Daha !/[\S]/.test($('Selector').html())iyi çalışmaz, bazı boşluklar bulduğunuzda boş olmadığını biliyorsunuz
qwertymk

Normal ifade bayraklarındaki / i neden? Boşluk karakterinin büyük ve küçük harf versiyonları var mı?
Alexis Wilke

teşekkürler, cevabımı güncelledim. Neden eklediğime dair hiçbir fikrim yok / i
Marc Uberstein

1
@RobertMallow, Belki regex \ S'yi destekler, ancak Unicode beyaz alanları burada gösterildiği gibi Cc, Zs, Zl, Zp olarak tanımlar: unicode.org/Public/UNIDATA/PropList.txt - büyük harf Lu ...
Alexis Wilke

1
@RobertMallow, ayrıca The production CharacterClassEscape :: S evaluates by returning the set of all characters not included in the set returned by CharacterClassEscape :: s.gelen ecma-international.org/ecma-262/5.1/#sec-15.10.2.12
Alexis Wilke




-1

JavaScript

var el= document.querySelector('body'); 
console.log(el);
console.log('Empty : '+ isEmptyTag(el));
console.log('Having Children : '+ hasChildren(el));


function isEmptyTag(tag) { 
    return (tag.innerHTML.trim() === '') ? true : false ;
}
function hasChildren(tag) {
    //return (tag.childElementCount !== 0) ? true : false ; // Not For IE
    //return (tag.childNodes.length !== 0) ? true : false ; // Including Comments
    return (tag.children.length !== 0) ? true : false ; // Only Elements
}

bunlardan herhangi birini kullanmayı deneyin!

document.getElementsByTagName('div')[0];
document.getElementsByClassName('topbar')[0];

document.querySelectorAll('div')[0];
document.querySelector('div'); // gets the first element.

-1

Bunu dene:

if (!$('#el').html()) {
    ...
}

-2

Satır kesmeleri FF'deki öğelerin içeriği olarak kabul edilir.

<div>
</div>
<div></div>

Ör:

$("div:empty").text("Empty").css('background', '#ff0000');

IE'de her iki div de boş kabul edilir, FF'de bir Chrome yalnızca sonuncusu boştur.

@Qwertymk tarafından sağlanan çözümü kullanabilirsiniz

if(!/[\S]/.test($('#element').html())) { // for one element
    alert('empty');
}

veya

$('.elements').each(function(){  // for many elements
    if(!/[\S]/.test($(this).html())) { 
        // is empty
    }
})
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.