Javascript 在jQuery中查找回退元素

Javascript 在jQuery中查找回退元素,javascript,jquery,jquery-selectors,Javascript,Jquery,Jquery Selectors,JavaScript对于回退和默认设置有非常好的语法,只要不成功的调用返回falsy值: var element = findElement() || findSomeOtherElement() || makeALastAttempt(); 然而,jQuery选择器即使是空的,也是真实的。 如果说“我希望元素在此选择器处,如果它不存在,则元素在此选择器处”,是否有一种优雅的方式?否。对不起,您必须使用.length属性。这是Javascript将所有对象评估为truthy的副作用,显然jQu

JavaScript对于回退和默认设置有非常好的语法,只要不成功的调用返回falsy值:

var element = findElement() || findSomeOtherElement() || makeALastAttempt();
然而,jQuery选择器即使是空的,也是真实的。

如果说“我希望元素在此选择器处,如果它不存在,则元素在此选择器处”,是否有一种优雅的方式?

否。对不起,您必须使用
.length
属性。这是Javascript将所有对象评估为truthy的副作用,显然jQuery选择器在功能上是一个对象。但是,生成的语法并不是那么糟糕:

$(function(){
  var element = $('.findElement'),
      otherElement = $('.findSomeOtherElement'),
      lastAttempt = $('.lastAttempt');

  var elegance = (element.length && element)
      || (otherElement.length && otherElement)
      || (lastAttempt.length && lastAttempt);

  elegance.css('border','1px solid green');
});

为什么不使用:

jQuery.fn.exists = function(){
if(this.length>0) 
    return this;
return false; };


var a = ($(selector1).exists() || $(selector2).exists());

如果只需要一个元素,则可以执行以下操作:

var element = $(findElement()[0] || findSomeOtherElement()[0] || makeALastAttempt()[0]);

这里有一个更接近实际需要的答案

var fallback = function(options){
    var numOfOptions = options.length;
    if (numOfOptions == 2){
        return (options[0].length > 0)? options[0] : options[1];
    }else if (numOfOptions > 2){
        return fallback(options.slice(1));
    }else if (numOfOptions == 1){
        return options[0];
    }else{
        return $();
    }
};
fallback([$(selector1),$(selector2),$(selector3)]);

将选择一个名为
anchorName
的元素,如果找不到,则选择另一个ID为
#anchorName

$("[name=anchorName], #anchorName").first()

如果您只想要一个元素作为结果,那么我最终得到:

$('#preferred-element').add($('#fallback-element')).first();

这个
不是已经是jQuery对象了吗
jQuery.fn.exists=function(){返回this.length>0?this:false;}
这应该是可行的,但是让一个
exists()
函数像getter一样运行似乎是一个代码,我将使用
$.fn.orElse=function{return This.length?This:$(s)}
。但是我希望有一种不扩展jQuery的好方法来实现这一点(即,即使第一个选择器与某个匹配,也会执行所有三个every选择器)@arnaud:True,但如果您愿意,您可以始终内联整个选择器。我只是预先计算了选择器的可读性。这是一个聪明的解决方案,但即使预先计算也很难阅读。值得指出的可能重复:当两者都存在并且首先在DOM中遇到
#anchorName
时,这将选择
#anchorName