Як перевірити нульові об'єкти в jQuery


169

Я використовую jQuery і хочу перевірити наявність елемента на своїй сторінці. Я написав наступний код, але він не працює:

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

Як перевірити існування елемента?

Відповіді:


251

Перевірте питання про jQuery ...

Ви можете використовувати властивість довжини колекції jQuery, повернуту вашим селектором:

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

що ти думаєш про var _myDiv = $ ('# myDiv'); ... .... якщо (_myDiv.lenght) {...} створити виняток.
Нурі ЙІЛМАЗ

1
як казав eleotlecram; краще уникати .length
numediaweb

5
@AurelianoBuendia, ви використовували lenghtзамість length; це помилка написання.
Сем

4
@numediaweb, eleotlecram не сказав уникати .length.
Сем

1
але .. ви б не отримали помилку "Неможливо прочитати властивість" length "null"?
Пробачте SEO

61

(Оскільки я, здається, не маю достатньої репутації, щоб проголосувати відповідь ...)

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

Виклик властивості довжини на невизначеному або нульовому об'єкті призведе до виходу з ладу браузерів 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
}

Хоча це правда, що виклик властивості довжини на невизначеному або нульовому об'єкті призведе до відмови браузерів, результат селекторів jQuery ($ ('...')) ніколи не буде нульовим або невизначеним. Таким чином, пропозиції щодо коду не мають сенсу. Використовуйте одну з інших відповідей, вони мають більше сенсу.


(Оновлення 2012 р.) Оскільки люди дивляться на код і ця відповідь є досить високою у списку: Останні пару років я використовую цей невеликий плагін:

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

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

__
Зміни листопада 2012 року:

1) Оскільки люди схильні дивитись на код, а не читати те, що сказано навколо коду, я додав дві великі зауваження лектора до цитованого коду Вовка.
2) Я додав код маленького плагіна, який використовую для цієї ситуації.


2
@VovaPopov: Я пропоную наступного разу трохи більше часу прочитати відповідь. Я просто констатував, що приклад коду "від Вольфа" був невірним. Я ніколи не давав відповіді, просто згадував деякі інші відповіді, які мають більше сенсу.
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 $ () завжди повертає ненуле значення - середні елементи, які відповідають вам селектору cretaria. Якщо елемент не знайдено, він поверне порожній масив. Тож ваш код буде виглядати приблизно так -

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, НЕ є масивом, це об'єкт з багатьма властивостями; одна з них є властивістю "довжини". Ви також можете перевірити розмір () або отримати (0) або get () - "get (0)" працює так само, як і доступ до першого елемента, тобто $ (elem) [0]



1

використовувати $("#selector").get(0)для перевірки з таким нулем. get повертає елемент dom, до цього часу ви не маєте справу з масивом, де вам потрібно перевірити властивість length. Особисто мені не подобається перевірка довжини на нульову обробку, це мене чомусь бентежить :)


Цікаво, як різні люди думають по-різному; Думаю, має сенс перевірити, чи кількість елементів дорівнює нулю, а не перевіряти, чи присутній перший елемент.
Сем

1

Використовуючи властивість довжини, ви можете це зробити.

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

Виклик властивості довжини на невизначеному або нульовому об'єкті призведе до виходу з ладу браузерів 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.