Найти запасной элемент в jQuery - PullRequest
4 голосов
/ 29 августа 2011

JavaScript имеет очень хороший синтаксис для откатов и значений по умолчанию, если неудачные вызовы возвращают ложное значение:

var element = findElement() || findSomeOtherElement() || makeALastAttempt();

Селекторы jQuery, тем не менее, верны, даже если они пусты.
Есть лиэлегантный способ, если сказать «Я хочу элемент в этом селекторе, а если он не существует, то элемент в этом селекторе»?

Ответы [ 5 ]

6 голосов
/ 29 августа 2011

Если вы ожидаете только один элемент, вы можете сделать это:

var element = $(findElement()[0] || findSomeOtherElement()[0] || makeALastAttempt()[0]);
3 голосов
/ 29 августа 2011

Почему бы не использовать:

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


var a = ($(selector1).exists() || $(selector2).exists());
1 голос
/ 05 января 2018

Выбирает элемент с именем anchorName и, если не найден, выбирает другой элемент с идентификатором #anchorName

$("[name=anchorName], #anchorName").first()
0 голосов
/ 07 июля 2015

Вот ответ намного ближе к тому, что было на самом деле желательно.

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)]);
0 голосов
/ 29 августа 2011

Нет. Извините, вам придется использовать свойство .length. Это побочный эффект Javascript, который оценивает все объекты как достоверные, и, очевидно, селектор 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');
});

DEMO

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...