Как проверить нулевые объекты в 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.