检测jquery选择器是否返回空对象的最佳方法是什么? 如果你有:

alert($('#notAnElement'));

你得到[object object],所以我现在做的方式是:

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

它会写"undefined"你可以检查一下。但这似乎很糟糕。还有别的办法吗?


当前回答

我喜欢使用presence,灵感来自Ruby on Rails:

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

你的例子是:

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

我发现它优于提议的$.fn。存在,因为您仍然可以使用布尔运算符或if,但真值结果更有用。另一个例子:

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

其他回答

我喜欢使用presence,灵感来自Ruby on Rails:

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

你的例子是:

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

我发现它优于提议的$.fn。存在,因为您仍然可以使用布尔运算符或if,但真值结果更有用。另一个例子:

$ul = $elem.find('ul').presence() || $('<ul class="foo">').appendTo($elem)
$ul.append('...')
if ( $("#anid").length ) {
  alert("element(s) found")
} 
else {
  alert("nothing found")
}

选择器返回一个jQuery对象数组。如果没有找到匹配的元素,则返回一个空数组。您可以检查选择器返回的集合的.length,或者检查第一个数组元素是否'undefined'。

您可以在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/

默认情况下,您可能希望一直这样做。我一直在努力包装jquery函数或jquery.fn.init方法来做到这一点没有错误,但你可以对jquery源代码做一个简单的改变来做到这一点。包括一些周围的线,你可以搜索。jquery对象实际上只是初始化构造函数'enhanced'

var
  version = "3.3.1",

  // Define a local copy of jQuery
  jQuery = function( selector, context ) {

    // The jQuery object is actually just the init constructor 'enhanced'
    // Need init if jQuery is called (just allow error to be thrown if not included)
    var result = new jQuery.fn.init( selector, context );
    if ( result.length === 0 ) {
      if (window.console && console.warn && context !== 'failsafe') {
        if (selector != null) {
          console.warn(
            new Error('$(\''+selector+'\') selected nothing. Do $(sel, "failsafe") to silence warning. Context:'+context)
          );
        }
      }
    }
    return result;
  },

  // Support: Android <=4.0 only
  // Make sure we trim BOM and NBSP
  rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;

jQuery.fn = jQuery.prototype = {

最后,你可以在这里获得未经压缩的jquery源代码:http://code.jquery.com/