jQueryを使用してHTML要素が空かどうかを確認するにはどうすればよいですか?


336

jQueryを使用して、HTML要素が空の場合にのみ関数を呼び出そうとしています。

このようなもの:

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 2013

2
これは見事です:-D
jasonbradberry

HTMLコメントもコンテンツと見なされます。
Paolo

関数でこれを行うのはもちろんいいですが、より「組み込み」(そして少しやりがい)が必要な場合は、jQueryのプロトタイプを操作するか、JQの優れた「フィルター」関数機能を使用することをお勧めします...
TheCuBeMan

117

これが唯一の信頼できる方法であることがわかりました(ChromeとFFは空白と改行を要素と見なしているため):

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

20
少し圧縮されたバージョンは、空の文字列のfalsyネスの利点を取ることができます: if(!$.trim($("selector").html())
ブランドンBelvin

11
彼らはそれらを「要素」とは考えていませんが、ノードと見なしています。これはIMOの正解です。if($("selector").children().length === 0)またはを行うこともできますif($("selector > *").length === 0)
panzi

1
「要素」と「ノード」を混同していると思います。

1
$( "selector")。html()。trim()=== ''
user1156544

1
理由はわかりませんが、この答えのメソッドif($。trim($( "selector")。html())== '')が機能しました。.is( ':empty')はしませんでした!
Zeljko Miloradovic

62

:emptyセレクターを使用する場合の主な問題は、空白と改行です。CSSでは:empty擬似クラスは同じように動作します。私はこの方法が好きです:

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

4
DIVにHTMLコメントがあったため、上記を選択しました。
Paolo、

2
これまでで最もエレガントなソリューションは、正解でなければなりません。
Christoffer Bubach 2015

6
$.children()このソリューションのみチェックを意味し、テキストやコメントノードを返しませんが、要素はの空である要素。テキストまたはコメントのみを含む要素を必要に応じて空と見なすべきでない場合は、他のソリューションのいずれかを使用する必要があります。
sierrasdetandil 2018年

select要素の@sierrasdetandil は完璧です。状態もすることができますif(! $el.children().length)
CPHPython

28
!elt.hasChildNodes()

はい、わかっています。これはjQueryではないので、これを使用できます。

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

今幸せです?


1
+1 filter必要がない限り関数内でjQueryを使用したくなかったので、jQuery 関数内であなたのアプローチを使用しました。
WynandB 2014

1
whitespace-onlyが空<div class="results"> </div>であると考えると、このステートメントはfalseを返します。jsfiddle.net/ytliuSVN/0pdwLt46
ペニーリュー

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

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

すごい!私はifsなしの構造が好きです。
Nikolay Fominyh

@Nikolayに完全に同意します、それは私の特定の状況では役に立ちませんが、将来のために覚えておきます!
vitto '25

まあ、これを適用しなければならないときは機能しません
Zeal Murapa '14

thisjQuery要素@ZealMurapa以外には何がありますか?
AlienWebguy 2015

12

「空」の場合は、HTMLコンテンツがないことを意味し、

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

注意してください、空白と改行はhtmlを== ''にしませんが、要素はまだ空です。別の解決策については、以下の私の答えを確認してください
DMTintner '28

8

テキストが含まれていないので空ですか?

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

これは、内容が画像である要素には対応していません(どのようにしてそれを思いついたかは尋ねないでください...)
Bad Request

@BadRequestいいえ、したがって、「as in contains no text?」の後に疑問符が付きます。:)
jensgram 2017

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;
}

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

または

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

0

あなたが試すことができます:

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

*大文字と小文字を区別して、空白を置き換えます;)


!/[\S]/.test($('Selector').html())空白が見つかったら、それが空ではないことがわかったら、うまく機能しないでしょう
qwertymk

なぜ正規表現フラグの/ iなのですか?スペース文字の大文字と小文字のバージョンはありますか?
Alexis Wilke 2014年

おかげで、私の答えを更新しました。/ iを追加した理由が
わかり

1
@RobertMallow、たぶん正規表現は\ Sをサポートしますが、Unicodeは次のように空白をCc、Zs、Zl、Zpとして定義します。 Zl 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>

例:

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

IEでは両方のdivは空と見なされ、FFではChromeの最後の1つだけが空です。

@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.