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

169

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

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

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

Prashant
источник

Ответы:

251

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

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

if ( $('#myDiv').length ){}
Christoph
источник
что вы думаете о 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) Я добавил код небольшого плагина, который я использую для этой ситуации.

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

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

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

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

$("#btext" + i).text("Branch " + i);
tvanfosson
источник
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.
theamoeba
источник
Это не решает вопрос.
Сэм
5

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

if ( $('selector').size() ) {...}                   
burntblark
источник
3
if ( $('#whatever')[0] ) {...}

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

Джеймс
источник
3

А как насчет использования "undefined"?

if (value != undefined){ // do stuff } 
Хью Сигрейвс
источник
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 
   }
}
ahmadjn
источник
-4
if (typeof($("#btext" + i)) == 'object'){
    $("#btext" + i).text("Branch " + i);
}
한지 만
источник
-7

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

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

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

или

if($("#something") === null){
  // don't do something
}
волк
источник