Як перевірити, чи 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 правильний. Нижче я розмістив відповідь, яка враховує це. Це було головним джерелом розчарувань для останнього проекту
DMTintner

2
Це геніально :-D
jasonbradberry

Коментарі HTML також вважаються вмістом.
Паоло

Зробити це за допомогою функції, звичайно, приємно, але якщо ви хочете, щоб вона була більш "вбудованою" (і трохи складною), я б рекомендував маніпулювати прототипом jQuery або використовувати чудовий здібність "фільтр" 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).
панци

1
Я думаю, ви плутаєте "елементи" з "вузлами".

1
$ ("селектор"). html (). trim () === ''
користувач1156544

1
Я не знаю чому, але метод з цієї відповіді: якщо ($. Trim ($ ("селектор"). Html ()) == '') працював. .is (': порожній') не став!
Желько Мілорадович

62

Пробіл та розрив рядків є головними проблемами використання пустого перемикача. Обережно, у CSS: пустий псевдоклас поводиться так само. Мені подобається цей метод:

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

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();

Чудово! Мені подобаються конструкції без ifs.
Микола Фоміних

повністю згоден з @Nikolay, це не корисно для моєї конкретної ситуації, але я запам'ятаю це на майбутнє!
vitto

добре, це не спрацює, коли вам доведеться застосувати "це"
Зор Мурапа,

Що ще було thisб, крім елемента jQuery @ZealMurapa?
AlienWebguy

12

Якщо під "порожнім" ви маєте на увазі відсутність вмісту 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())
вдасться

Чому / i у прапорах регулярного вибору? Чи є верхні та малі версії символу пробілу?
Алексіс Вілке

дякую, оновив мою відповідь. Я поняття не маю, чому я додав / я
Marc Uberstein

1
@RobertMallow, Можливо, регулярний вираз підтримує \ 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>

Наприклад:

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

У IE обидва диви вважаються порожніми, у 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
    }
})
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.