如何在jQuery中检查空对象


169

我正在使用jQuery,我想检查页面中元素的存在。我已经编写了以下代码,但无法正常工作:

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

如何检查元素的存在?

Answers:


251

检查jQuery FAQ ...

您可以使用选择器返回的jQuery集合的length属性:

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

您如何看待var _myDiv = $('#myDiv'); ..... if(_myDiv.lenght){...}产生异常。
Nuri YILMAZ,

1
正如伊洛特克拉姆所说;最好避免使用.length
numediaweb'5

5
@AurelianoBuendia,您已使用lenght而不是length; 这是拼写错误。
山姆

4
@ numediaweb,eleotlecram没有说要避免.length
山姆

1
但是..您不会收到“无法读取属性'length'为null的错误”错误吗?
Sagive SEO

61

(因为我似乎没有足够的声誉来否决答案……)

写道:

在undefined或null对象上调用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
}

确实,在未定义或null对象上调用length属性会导致浏览器失败,但是jQuery选择器($('...'))的结果将永远不会为null或undefined。因此,代码建议毫无意义。使用其他答案之一,它们更有意义。


(2012年更新)因为人们看着代码,而且答案很明显:在过去的几年中,我一直在使用这个小插件:

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

我认为$('div')。any()的读取效果好于$('div')。length,而且您不会遭受错别字的困扰:$('div')。ayn()将给出运行时错误,$('div')。lenght将很可能始终是虚假的。

__
2012年11月修改:

1)因为人们倾向于看代码而不是阅读代码周围的内容,所以我在引用的Wolf代码中添加了两个重要的注意事项。
2)我添加了用于这种情况的小插件的代码。


2
@VovaPopov:我建议下次您花更多时间阅读答案。我只是说“ Wolf”的代码示例不正确。我从未提供答案,只是提到了其他一些更有意义的答案。
eleotlecram

好答案。对不起人们误解了。
乔·西蒙斯

14

查找函数返回匹配元素的数组。您可以检查长度是否为零。请注意,所做的更改仅查找元素一次,然后根据需要重新使用结果。

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

另外,您是否尝试过仅使用text函数-如果不存在任何元素,它将什么都不做。

$("#btext" + i).text("Branch " + i);

7
0是一个错误值,因此elem.length表达式的计算结果为false-换句话说,不需要'!= 0'部分
James

2
@ 999,我认为对零的检查使代码更具可读性,尽管习惯于编写脚本语言的人可能都可以用两种方式读取代码。
山姆

12

jQuery $()函数始终返回非null值-表示与选择器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对象不是数组,而是具有许多属性的对象;其中之一是“长度”属性。您也可以检查size()或get(0)或get()-“ get(0)”的工作方式与访问第一个元素相同,即$(elem)[0]



1

用于$("#selector").get(0)像这样检查null。get返回dom元素,直到您处理数组为止,在该数组中需要检查length属性。我个人不喜欢对null处理进行长度检查,由于某种原因,这使我感到困惑:)


不同的人有不同的想法很有趣。我认为检查元素的数量是否为零比检查是否存在第一个元素更有意义。
山姆


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 
   }
}

-4
if (typeof($("#btext" + i)) == 'object'){
    $("#btext" + i).text("Branch " + i);
}

-7

在undefined或null对象上调用length属性将导致IE和Webkit浏览器失败!

而是尝试以下方法:

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

要么

if($("#something") === null){
  // don't do something
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.