Как определить, возвращает ли селектор значение null?

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

alert($('#notAnElement'));

вы получаете [object Object], поэтому я делаю это сейчас:

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

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

7 ответов


мой любимый, чтобы расширить jQuery с этим крошечным удобством:

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

Как использовать:

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

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


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

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

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

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

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

$.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/


мне нравится использовать presence, вдохновлен Ruby на 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('...')

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

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

использовать так:

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

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

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

Это находится в документации JQuery:

http://learn.jquery.com/using-jquery-core/faq/how-do-i-test-whether-an-element-exists/

  alert( $( "#notAnElement" ).length ? 'Not null' : 'Null' );