Как проверить, является ли элемент HTML пустым, используя jQuery?

336

Я пытаюсь вызвать функцию, только если элемент HTML пуст, используя jQuery.

Что-то вроде этого:

if (isEmpty($('#element'))) {
    // do something
}
Vitto
источник
$('#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 правильно. Я разместил ответ ниже, который принимает это во внимание. Это было основным источником разочарования для меня в недавнем проекте
DMTintner
2
Это великолепно :-D
jasonbradberry
HTML-комментарии тоже считаются контентом.
Паоло
Делать это с функцией, конечно, приятно, но если вы хотите, чтобы она была более «встроенной» (и немного сложной), я бы порекомендовал манипулировать прототипом jQuery или использовать замечательную функцию «фильтра» функции JQ ...
TheCuBeMan
117

Я обнаружил, что это единственный надежный способ (поскольку Chrome и FF рассматривают пробелы и разрывы строк как элементы):

if($.trim($("selector").html())=='')
Серж Шульц
источник
20
Немного более сжатая версия может воспользоваться ложностью пустой строки: if(!$.trim($("selector").html())
Брэндон Белвин
11
Я не думаю, что они считают их «элементами», но они считают их узлами, что правильно для ИМО. Вы также можете сделать if($("selector").children().length === 0)или if($("selector > *").length === 0).
Panzi
1
Я думаю, что вы путаете «элементы» с «узлами».
1
$ ("селектор"). html (). trim () === ''
user1156544
1
Я не знаю почему, но метод из этого ответа: если ($. Trim ($ ("селектор"). Html ()) == '') работал. .is (': empty') нет!
Желько Милорадович
62

Пробелы и разрывы строк являются основными проблемами при использовании: пустой селектор. Осторожно, в CSS псевдокласс: empty ведет себя так же. Мне нравится этот метод:

if ($someElement.children().length == 0){
     someAction();
}
DMTintner
источник
4
Я выбрал это выше, потому что у меня были комментарии HTML в моем DIV.
Паоло
2
Безусловно самое элегантное решение, должен быть правильный ответ.
Кристоффер Бубах
6
Обратите внимание, что $.children()он не возвращает текст или узлы комментариев, что означает, что это решение проверяет только то, что элемент пуст из элементов . Если элемент, содержащий только текст или комментарии, не следует считать пустым для ваших нужд, вам следует использовать одно из других решений.
sierrasdetandil
@sierrasdetandil для selectэлементов идеально подходит. условие также может быть if(! $el.children().length).
CPHPython
28
!elt.hasChildNodes()

Да, я знаю, это не jQuery, так что вы можете использовать это:

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

Счастливы сейчас?


источник
1
+1 Я использовал ваш подход внутри filterфункции jQuery, так как не хотел использовать jQuery внутри функции без необходимости.
WynandB
1
Если я считаю пустой пробел пустым <div class="results"> </div>, это утверждение возвращает ложь. jsfiddle.net/ytliuSVN/0pdwLt46
Пенни Лю
19
jQuery.fn.doSomething = function() {
   //return something with 'this'
};

$('selector:empty').doSomething();
AlienWebguy
источник
Большой! Мне нравятся конструкции без ifs.
Николай Фоминых
полностью согласен с @Nikolay, это не полезно для моей конкретной ситуации, но я запомню это на будущее!
Витто
ну, это не сработает, когда вы должны применить «это»
Рев Мурапа
Что еще будет thisпомимо элемента jQuery @ZealMurapa?
AlienWebguy
12

Если под "пусто", вы имеете в виду без содержания HTML,

if($('#element').html() == "") {
  //call function
}
Цифровой самолет
источник
осторожно, пробелы и разрывы строк могут привести к тому, что html не будет == '', но элемент все равно будет пустым. Проверьте мой ответ ниже для другого решения
DMTintner
8

Пусто как в не содержит текста?

if (!$('#element').text().length) {
    ...
}
jensgram
источник
Это не относится к элементам, содержимое которых является изображениями (не спрашивайте, как я это придумал ...)
Плохой запрос
@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
}
RuiVBoas
источник
2

Еще один вариант, который требует меньше «работы» для браузера, чем html()или children():

function isEmpty( el ){
  return !el.has('*').length;
}
dahlbyk
источник
1
document.getElementById("id").innerHTML == "" || null

или

$("element").html() == "" || null
MayorMonty
источник
0

Можешь попробовать:

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

* Заменить пробелы, просто в случае;)

Марк Уберштейн
источник
Не будет !/[\S]/.test($('Selector').html())работать лучше, если вы найдете какое-то свободное
место,
Почему / я в флагах регулярных выражений? Существуют ли прописные и строчные версии символа пробела?
Алексис Уилке
спасибо, обновил мой ответ. Я понятия не имею, почему я добавил / я
Марк Уберштейн
1
@RobertMallow, возможно, регулярное выражение поддерживает \ S, однако Юникод определяет пробелы как Cc, Zs, Zl, Zp, как показано здесь: unicode.org/Public/UNIDATA/PropList.txt - верхний регистр - Lu ...
Алексис Уилк,
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
Алексис
-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.
Яши
источник
-1

Попробуй это:

if (!$('#el').html()) {
    ...
}
Сайед
источник
-2

Разрывы строк рассматриваются как содержимое элементов в FF.

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

Пример:

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

В IE оба div считаются пустыми, в FF 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
    }
})
Корнелиу
источник