Как проверить нулевые объекты в jQuery


169

Я использую jQuery и хочу проверить наличие элемента на моей странице. Я написал следующий код, но он не работает:

if($("#btext" + i) != null) {
    //alert($("#btext" + i).text());
    $("#btext" + i).text("Branch " + i);
}

Как проверить наличие элемента?

Ответы:


251

Проверьте jQuery FAQ ...

Вы можете использовать свойство length коллекции jQuery, возвращаемой вашим селектором:

if ( $('#myDiv').length ){}

что вы думаете о var _myDiv = $ ('# myDiv'); ... .... if (_myDiv.lenght) {...} произвести исключение.
— Нури Йылмаз

1
как сказал eleotlecram; лучше избегать .length
— numediaweb

5
@AurelianoBuendia, вы использовали lenghtвместо length; это орфографическая ошибка
— Сэм

4
@numediaweb, eleotlecram не сказал, чтобы избежать .length.
— Сэм

1
но .. не получите ли вы сообщение об ошибке «Не удается прочитать свойство« длина »с нулевым значением»?
— Sagive SEO

61

(Поскольку у меня, кажется, недостаточно репутации, чтобы проголосовать за ответ ...)

Волк написал:

Вызов свойства length для неопределенного или нулевого объекта приведет к сбою браузеров IE и webkit!

Вместо этого попробуйте это:

 // NOTE!! THE FOLLOWING IS WRONG; DO NOT USE!  -- EleotleCram
if($("#something") !== null){
  // do something
}

или

 // NOTE!! THE FOLLOWING IS WRONG; DO NOT USE!  -- EleotleCram
if($("#something") === null){
  // don't do something
}

Хотя верно, что вызов свойства length для неопределенного или нулевого объекта приведет к сбою браузеров, результат работы селекторов jQuery ($ ('...')) никогда не будет нулевым или неопределенным. Таким образом, предложения кода не имеют смысла. Используйте один из других ответов, они имеют больше смысла.


(Обновление 2012 г.) Поскольку люди смотрят на код, и этот ответ довольно высок в списке: последние пару лет я использовал этот небольшой плагин:

  jQuery.fn['any'] = function() {
     return (this.length > 0);
  };

Я думаю, что $ ('div'). Any () читается лучше, чем $ ('div'). Length , плюс вы не будете так сильно страдать от опечаток: $ ('div'). Ayn () выдаст ошибку времени выполнения , $ ('div'). длина будет молча, скорее всего, всегда будет ложной.

__
редактирует ноябрь 2012:

1) Поскольку люди склонны смотреть на код, а не читать то, что говорится вокруг кода, я добавил две большие заметки лектора предостережения в цитируемый код Wolf.
2) Я добавил код небольшого плагина, который я использую для этой ситуации.


2
@ VovaPopov: Я предлагаю в следующий раз уделить немного времени, чтобы прочитать ответ. Я просто заявлял, что пример кода "от Wolf" был неверным. Я никогда не давал ответ, просто ссылался на некоторые другие ответы, которые имеют больше смысла.
— eleotlecram

Хороший ответ. Мне жаль, что люди неверно истолковывают это.
— Джо Симмонс

14

Функция поиска возвращает массив совпадающих элементов. Вы можете проверить, равна ли длина нулю. Обратите внимание на изменение, чтобы искать элементы только один раз и использовать результаты по мере необходимости.

var elem = $("#btext" + i);
if (elem.length != 0) {
   elem.text("Branch " + i);
}

Кроме того, вы пытались просто использовать текстовую функцию - если элемент не существует, он ничего не будет делать.

$("#btext" + i).text("Branch " + i);

7
0 является ложным значением, поэтому выражение elem.length оценивается как ложное - другими словами, нет необходимости в части '! = 0'
— Джеймс

2
@ 999, я думаю, что проверка на ноль делает код более читабельным, хотя оба пути, вероятно, читаемы тем, кто привык к языкам сценариев.
— Сэм

12

Функция jquery $ () всегда возвращает ненулевое значение - средние элементы соответствуют выбранному вами селектору. Если элемент не был найден, он вернет пустой массив. Так что ваш код будет выглядеть примерно так:

if ($("#btext" + i).length){
        //alert($("#btext" + i).text());
    $("#btext" + i).text("Branch " + i);
}

1
Я не думаю, что это правда, что $ () возвращает массив. Поведение объектов jQuery аналогично массивам, но я не думаю, что они на самом деле являются массивами, и я думаю, вы обнаружите, что не все их поведение такое же, как у массивов. Смотрите эту быструю демонстрацию .
— Сэм

5

В jQuery 1.4 вы получаете функцию $ .isEmptyObject, но если вы вынуждены использовать более старую версию jQ, как мы, бедные разработчики Drupal, просто украдем этот код:

// This is a function similar to the jQuery 1.4 $.isEmptyObject.
function isObjectEmpty(obj) {
  for ( var name in obj ) {
    return false;
  }
  return true;
}

Используйте это как:

console.log(isObjectEmpty(the_object)); // Returns true or false.

Это не решает вопрос.
— Сэм

5

Независимо от того, что вы выбрали, функция $()всегда возвращает объект jQuery, чтобы его нельзя было использовать для тестирования. Лучший способ (если не единственный) - использовать size()функцию или свойство собственной длины, как описано выше.

if ( $('selector').size() ) {...}                   

3
if ( $('#whatever')[0] ) {...}

Объект jQuery, который возвращается всеми нативными методами jQuery, НЕ является массивом, это объект со многими свойствами; один из них является свойством длины. Вы также можете проверить size () или get (0) или get () - 'get (0)' работает так же, как и доступ к первому элементу, то есть $ (elem) [0]



1

используйте $("#selector").get(0)для проверки с нулевым, как это. get возвращает элемент dom, пока вы не обработаете массив, где вам нужно проверить свойство length. Лично мне не нравится проверка длины для нулевой обработки, она почему-то меня смущает :)


Интересно, как разные люди думают по-разному; Я думаю, что имеет больше смысла проверять, равно ли количество элементов нулю, а не проверять, присутствует ли первый элемент.
— Сэм

1

Используя свойство length, вы можете сделать это.

jQuery.fn.exists = function(){return ($(this).length < 0);}
if ($(selector).exists()) { 
   //do somthing
}

2
Вы имеете в виду (это). Длина> 0?
— sage88

0

когда объект пуст, возвращаем эту ошибку:

Uncaught TypeError: Cannot read property '0' of null

Я пытаюсь этот код:

try{
  if ($("#btext" + i).length) {};               
}catch(err){
  if ($("#btext" + i).length) {
     //working this code if the item, not NULL 
   }
}


-7

Вызов свойства length для неопределенного или нулевого объекта приведет к сбою браузеров IE и webkit!

Вместо этого попробуйте это:

if($("#something") !== null){
  // do something
}

или

if($("#something") === null){
  // don't do something
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.