2014-09-24 13 views
0

我很好奇,为什么jQuery的表达带有||的jQuery简单表达式但不明结果

$("#mydiv").find(".myitem1") || $("#mydiv").find(".myitem2");回报[]如果: .myitem1不存在于页面上。另外,$("#mydiv").find(".myitem2")确实存在,结果是一个非空对象。

我希望得到的结果是第一个表达式,如果它存在,否则第二个表达式。如您所见,我使用||。我究竟做错了什么?

+3

'.find()'总是返回一个jQuery集合(不是数组),它们都是*从不*虚假。 – Bergi 2014-09-24 13:02:22

+1

你将不得不在这里使用三元运算符$(“#mydiv”)。find(“。myitem1”)。length? $(“#mydiv”)。find(“。myitem1”):$(“#mydiv”)。find(“。myitem2”);' - 如果可能的话缓存'$(“#mydiv”)的值。 (“.myitem1”)' – 2014-09-24 13:04:54

+0

@Arun P Johny:这是一个你不应该推荐三元的地方,因为你运行初始选择器两次。缓存它是一个好主意。也许最好用一个简单的'if' :) – 2014-09-24 13:19:22

回答

1

的失败的原因都在评论,但是,鉴于您正在尝试,为什么不使用这个(如果它们在顺序页)逻辑的解释:

$("#mydiv").find(".myitem1,.myitem2").first(); 

以其它方式使用:

var $result = $("#mydiv").find(".myitem1"); 
if (!$result.length){ 
    $result = $("#mydiv").find(".myitem2"); 
} 

不要像原样使用三元表达式,因为它会运行第一个选择器两次。使用三元这样的:

var $result = $("#mydiv").find(".myitem1"); 
$result = $result.length ? $result : $("#mydiv").find(".myitem2"); 

您当前的代码假定find回报什么,如果一个没有找到匹配,但是这不是jQuery的允许的方法链接。它会一直返回一个jQuery对象(只是一个没有匹配的空对象)。这允许像$('#youCantMatchThis').text();这样的jQuery代码返回一个空字符串,而不会给出错误。

+0

谢谢大家可能的解决方案。我找到$(“#mydiv”)。find(“。myitem1,.myitem2”)。first();最好的,因为它很短,清晰,不会使用两次选择器,这就是我需要的。谢谢大家。 – Haradzieniec 2014-09-24 13:25:37