ฉันจะตรวจสอบว่าองค์ประกอบ HTML ว่างเปล่าโดยใช้ jQuery ได้อย่างไร


336

ฉันพยายามเรียกใช้ฟังก์ชันเฉพาะถ้าองค์ประกอบ HTML ว่างเปล่าโดยใช้ jQuery

บางสิ่งเช่นนี้

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

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

คำตอบ:


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

สำหรับข้อมูลเพิ่มเติมดูที่http://api.jquery.com/is/และhttp://api.jquery.com/empty-selector/

แก้ไข:

ดังที่บางคนชี้ไปการตีความเบราว์เซอร์ขององค์ประกอบว่างอาจแตกต่างกันไป หากคุณต้องการที่จะไม่สนใจองค์ประกอบที่มองไม่เห็นเช่นช่องว่างและตัวแบ่งบรรทัดและทำให้การใช้งานสอดคล้องกันมากขึ้นคุณสามารถสร้างฟังก์ชั่น (หรือเพียงแค่ใช้รหัสที่อยู่ภายใน)

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

คุณสามารถทำให้เป็นปลั๊กอิน jQuery ได้ แต่คุณจะได้แนวคิด


56
การขึ้นบรรทัดใหม่ถือเป็นเนื้อหาขององค์ประกอบใน FF และ Chrome
Corneliu

@Corneliu ถูกต้อง ฉันโพสต์คำตอบด้านล่างที่นำมาพิจารณาด้วย นี่เป็นแหล่งที่มาของความหงุดหงิดสำหรับฉันในโครงการล่าสุด
DMTintner

2
นี่เป็นสิ่งที่ยอดเยี่ยม :-D
jasonbradberry

ความคิดเห็น HTML ถือว่าเป็นเนื้อหาเช่นกัน
เปาโล

การทำเช่นนี้กับฟังก์ชั่นเป็นสิ่งที่ดีแน่นอน แต่ถ้าคุณต้องการมันมากกว่านั้น "ฝังตัว" (และท้าทายนิดหน่อย) ฉันขอแนะนำให้จัดการต้นแบบของ jQuery หรือใช้ความสามารถของฟังก์ชั่น "filter" ที่ยอดเยี่ยมของ JQ ...
TheCuBeMan

117

ฉันพบว่านี่เป็นวิธีเดียวที่เชื่อถือได้ (เนื่องจาก Chrome & FF พิจารณาว่าช่องว่างและการกระจายบรรทัดเป็นองค์ประกอบ):

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

20
รุ่นที่บีบอัดมากกว่าเล็กน้อยสามารถใช้ประโยชน์จากความผิดพลาดของสตริงที่ว่างเปล่า: if(!$.trim($("selector").html())
แบรนดอนเบลวิน

11
ฉันไม่คิดว่าพวกเขาคิดว่าพวกเขา "องค์ประกอบ" แต่พวกเขาคิดว่าพวกเขาโหนดซึ่งเป็น IMO ที่ถูกต้อง นอกจากนี้คุณยังสามารถทำหรือif($("selector").children().length === 0) if($("selector > *").length === 0)
panzi

1
ฉันคิดว่าคุณทำให้ "องค์ประกอบ" สับสนกับ "โหนด"

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

1
ฉันไม่ทราบว่าทำไม แต่วิธีการจากคำตอบนี้: ถ้า ($. trim ($ ("selector"). html ()) == '') ทำงาน .is (': empty') ไม่ได้!
Zeljko Miloradovic

62

พื้นที่สีขาวและตัวแบ่งบรรทัดเป็นปัญหาหลักของการใช้: ตัวเลือกที่ว่างเปล่า ระวังใน CSS คลาส pseudo ที่ว่างเปล่าทำงานในลักษณะเดียวกัน ฉันชอบวิธีนี้:

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

4
ฉันเลือกที่ด้านบนเพราะฉันมีความคิดเห็น HTML ใน DIV ของฉัน
เปาโล

2
โดยคำตอบที่ดีที่สุดควรเป็นคำตอบที่ถูกต้อง
Christoffer Bubach

6
โปรดทราบว่า$.children()ไม่กลับข้อความหรือแสดงความคิดเห็นโหนดซึ่งหมายถึงการตรวจสอบการแก้ปัญหานี้เพียงอย่างเดียวคือองค์ประกอบที่ว่างเปล่าขององค์ประกอบ หากองค์ประกอบที่มีเพียงข้อความหรือความคิดเห็นไม่ควรพิจารณาว่าว่างเปล่าสำหรับความต้องการของคุณคุณควรใช้วิธีแก้ไขปัญหาอื่น
sierrasdetandil

@sierrasdetandil สำหรับselectองค์ประกอบที่สมบูรณ์แบบ if(! $el.children().length)สภาพยังสามารถ
CPHPython

28
!elt.hasChildNodes()

ใช่ฉันรู้ว่านี่ไม่ใช่ jQuery ดังนั้นคุณสามารถใช้สิ่งนี้:

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

ตอนนี้มีความสุข?


1
+1 ฉันใช้วิธีการของคุณในfilterฟังก์ชั่นjQuery เพราะฉันไม่ต้องการใช้ jQuery ภายในฟังก์ชั่นเว้นแต่จำเป็น
WynandB

1
ถ้าฉันคิดว่า whitespace-only ว่างเปล่า<div class="results"> </div>คำสั่งนี้จะคืนค่าเท็จ jsfiddle.net/ytliuSVN/0pdwLt46
Penny Liu

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

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

ที่ดี! ฉันชอบสิ่งปลูกสร้างที่ไม่มี ifs
Nikolay Fominyh

เห็นด้วยโดยสิ้นเชิงกับ @Nikolay มันไม่ได้มีประโยชน์สำหรับสถานการณ์เฉพาะของฉัน แต่ฉันจะจำมันได้ในอนาคต!
vitto

ดีนี้จะไม่ทำงานเมื่อคุณต้องใช้ 'นี้'
Zeal Murapa

มีอะไรอีกที่thisนอกเหนือจากองค์ประกอบ jQuery @ZealMurapa
AlienWebguy

12

ถ้าโดย "empty" คุณหมายถึงไม่มีเนื้อหา HTML

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

ระวังช่องว่างและการแบ่งบรรทัดอาจทำให้ html ไม่ == '' แต่องค์ประกอบยังคงว่างเปล่า ตรวจสอบคำตอบของฉันด้านล่างเพื่อรับการแก้ปัญหาอื่น
DMTintner

8

ว่างเปล่าเหมือนไม่มีข้อความ?

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

สิ่งนี้ไม่ได้ระบุองค์ประกอบที่มีเนื้อหาเป็นรูปภาพ (ไม่ต้องถามว่าฉันคิดอย่างไรกับสิ่งนั้น ... )
คำขอไม่ถูกต้อง

@BadRequest ไม่ดังนั้นเครื่องหมายคำถามหลัง "ในไม่มีข้อความ ?" :)
jensgram

7

ในประวัติย่อมีตัวเลือกมากมายที่จะค้นหาว่าองค์ประกอบว่างเปล่าหรือไม่:

1- การใช้html:

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

2- การใช้text:

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

3- การใช้is(':empty'):

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

4- การใช้ length

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

ในการติดถ้าคุณพยายามที่จะหาว่าองค์ประกอบการป้อนข้อมูลว่างเปล่าคุณสามารถใช้val:

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

2

ตัวเลือกอื่นที่ควรใช้ "งาน" น้อยลงสำหรับเบราว์เซอร์มากกว่าhtml()หรือchildren():

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


0

คุณสามารถลอง:

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

* แทนที่ช่องว่างสีขาวเพียงใส่หีบ)


จะไม่!/[\S]/.test($('Selector').html())ทำงานได้ดีขึ้นเมื่อคุณพบช่องว่างที่คุณรู้ว่ามันว่างเปล่า
qwertymk

ทำไม / i ในการตั้งค่าสถานะ regex มีอักขระช่องว่างส่วนบนและล่างหรือไม่
Alexis Wilke

ขอบคุณอัปเดตคำตอบของฉัน ฉันไม่รู้ว่าทำไมฉันถึงเพิ่ม / i
Marc Uberstein

1
@ RobertMallow, บางที regex รองรับ \ S, อย่างไรก็ตาม Unicode กำหนดช่องว่างเป็น Cc, Zs, Zl, Zp ดังที่แสดงไว้ที่นี่: unicode.org/Public/UNIDATA/PropList.txt - กรณีบนคือ Lu ...
Alexis Wilke

1
@RobertMallow ยังThe production CharacterClassEscape :: S evaluates by returning the set of all characters not included in the set returned by CharacterClassEscape :: s.มาจาก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
}

ลองใช้สิ่งนี้!

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

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


-2

การขึ้นบรรทัดใหม่ถือเป็นเนื้อหาขององค์ประกอบใน FF

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

Ex:

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

ใน IE ทั้ง divs นั้นจะถือว่าว่างเปล่าใน FF an Chrome เท่านั้นอันสุดท้ายนั้นจะว่างเปล่า

คุณสามารถใช้โซลูชันที่ให้บริการโดย @qwertymk

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

หรือ

$('.elements').each(function(){  // for many elements
    if(!/[\S]/.test($(this).html())) { 
        // is empty
    }
})
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.