Как я могу определить, возвращает ли селектор null?

Каков наилучший способ определить, возвращает ли jQuery-селектор пустой объект. Если вы выполните:

alert($('#notAnElement'));

вы получаете [object Object], так что теперь я делаю это:

alert($('#notAnElement').get(0));

который будет писать "undefined", и поэтому вы можете сделать чек для этого. Но это кажется очень плохим. Какой еще способ?

Ответ 1

Моим любимым является расширение jQuery с помощью этого крошечного удобства:

$.fn.exists = function () {
    return this.length !== 0;
}

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

$("#notAnElement").exists();

Более явный, чем использование длины.

Ответ 2

if ( $("#anid").length ) {
  alert("element(s) found")
} 
else {
  alert("nothing found")
}

Ответ 3

Селектор возвращает массив объектов jQuery. Если совпадающие элементы не найдены, он возвращает пустой массив. Вы можете проверить .length коллекции, возвращенной селектором, или проверить, является ли первый элемент массива "undefined".

Вы можете использовать любые следующие примеры внутри оператора IF, и все они дают одинаковый результат. Правда, если селектор нашел соответствующий элемент, в противном случае будет false.

$('#notAnElement').length > 0
$('#notAnElement').get(0) !== undefined
$('#notAnElement')[0] !== undefined

Ответ 4

Мне нравится делать что-то вроде этого:

$.fn.exists = function(){
    return this.length > 0 ? this : false;
}

Итак, вы можете сделать что-то вроде этого:

var firstExistingElement = 
    $('#iDontExist').exists() ||      //<-returns false;
    $('#iExist').exists() ||          //<-gets assigned to the variable 
    $('#iExistAsWell').exists();      //<-never runs

firstExistingElement.doSomething();   //<-executes on #iExist

http://jsfiddle.net/vhbSG/

Ответ 5

Мне нравится использовать presence, вдохновленный Ruby on Rails:

$.fn.presence = function () {
    return this.length !== 0 && this;
}

Пример:

alert($('#notAnElement').presence() || "No object found");

Я нахожу его выше предлагаемого $.fn.exists, потому что вы все еще можете использовать логические операторы или if, но более правдоподобный результат. Другой пример:

$ul = $elem.find('ul').presence() || $('<ul class="foo">').appendTo($elem)
$ul.append('...')

Ответ 6

Мои предпочтения, и я понятия не имею, почему это еще не в jQuery:

$.fn.orElse = function(elseFunction) {
  if (!this.length) {
    elseFunction();
  }
};

Используется следующим образом:

$('#notAnElement').each(function () {
  alert("Wrong, it is an element")
}).orElse(function() {
  alert("Yup, it not an element")
});

Или, как он выглядит в CoffeeScript:

$('#notAnElement').each ->
  alert "Wrong, it is an element"; return
.orElse ->
  alert "Yup, it not an element"