как связать селекторы с условием ИЛИ (альтернативный набор результатов, если main пусто) - PullRequest
6 голосов
/ 25 октября 2011

Что у меня сейчас:

var result = $('selector1');
if (result.length == 0) result = $('selector2');

но это побеждает цепочку.

Вопрос в том, как получить тот же результат с JQuery-цепочкой?

Я не могу использовать $('selector1, selector2'), потому что это всегда будет выбирать наборы результатов для обоих селекторов, а мне нужны результатыselector2 только если нет соответствующих элементов для selector1.

Ответы [ 4 ]

3 голосов
/ 25 октября 2011

Такое поведение в некоторых местах называется «объединением». Вот общий плагин jQuery, который делает это за вас (редактирование после отличного отзыва, см. Комментарии).

// The namespace function
jQuery.coalesce = function(selectors){

    var out;

    $.each(selectors, function(i, v){
        var el = jQuery(v);
        if (el.length) {
           out = el;
           return false;
        }
    });

    return out || jQuery();
};

// The jQuery plugin
jQuery.fn.coalesce = function(){
    return jQuery.coalesce(this.selector.split(",")); //a little brittle
};

Итак, в мире, где #foo не существует, а a и div существуют, если вы делаете:

jQuery.coalesce(["#foo", "a", "div"])

Возвращает jQuery("a"), если #foo не существует, или jQuery("#foo"), если #foo существует.

Если вам требуется использовать его в середине цепочки, вы можете использовать $("#foo, a, div").coalesce(), но он уязвим для комманов в самих селекторах.

0 голосов
/ 25 октября 2011

Я не верю, что вы можете делать это именно так, как вы хотите, просто используя чистый jQuery, но вы можете получить некоторые функции, которые вам нужны, с помощью расширенных селекторов jQuery, которые позволяют выбирать на основе отрицания и булевы операторы. Проверить http://api.jquery.com/category/selectors/jquery-selector-extensions/.

0 голосов
/ 25 октября 2011
var result = $('selector1');
( result.length ? result : $('selector2') ).css('color', 'red');
0 голосов
/ 25 октября 2011

Если вы должны , это будет сделано:

$(function(){
  var r = $('selector1');
  if (r.length == 0) r = $('selector2');
  return r;
}());

Однако я не думаю, что в вашем примере цепочка побеждена. Цепочка - это не главное, и вставка измученного выбора, подобного приведенному выше, служит скорее для запутывания кода, чем для упрощения.

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