Как написать этот тернарный оператор с помощью jQuery?

в этой скрипке http://jsfiddle.net/mjmitche/6nar4/3/, Если вы перетащите, например, маленький синий ящик в желтый ящик, то большой черный ящик станет розовым. Все 4 коробки слева можно перетащить в коробки внутри черного ящика.

В конце скрипки вы видите код, который меняет черный ящик на розовый.

однако я хочу сделать это тернарным оператором, так что если коробка черная, то она становится розовой, но если это я покраснела, а потом хочу, чтобы он снова стал черным.

Я знаю, что троица такая

x ? y: z

поэтому я попробовал это, хотя знал, что это, вероятно, неправильно

$("#blackbox").css({'background':'pink'}); ?

    $("#blackbox").css({'background':'black'}); : 

$("#blackbox").css({'background':'pink'}); 

Я думаю, что первая строка перед вопросительным знаком вызывает проблему, поэтому как создать if заявление?

8 ответов


Я бы пошел с таким кодом:

var oBox = $("#blackbox");
var curClass = oBox.attr("class");
var newClass = (curClass == "bg_black") ? "bg_pink" : "bg_black";
oBox.removeClass().addClass(newClass);

чтобы он работал, вам сначала нужно изменить свой CSS и удалить background С #blackbox декларации, добавьте эти два класса:

.bg_black { background-color: #000; }
.bg_pink { background-color: pink; }

и назначить класс bg_black до blackbox изначально элемент.

Обновлено jsFiddle:http://jsfiddle.net/6nar4/17/

на мой взгляд, это более читаемо, чем другие ответы, но это зависит от вас, чтобы выбрать, конечно.


Я бы сделал (добавил кэширование):

var bbx = $("#blackbox");
 bbx.css('background-color') === 'rgb(255, 192, 203)' ? bbx.css('background','black') : bbx.css('background','pink')

скрипка wroking (новая снова):http://jsfiddle.net/6nar4/37/

мне пришлось изменить первый оператор как css() возвращает значение rgb цвета


Я думаю, что у Дэна и Николы есть подходящий исправленный код, однако вам может быть неясно, почему исходный код не работал.

то, что здесь называется "троичным оператором", называется условным оператором в разделе 11.12 ECMA-262. Она имеет вид:

LogicalORExpression ? AssignmentExpression : AssignmentExpression

вычисляется LogicalORExpression и возвращаемое значение преобразуется в Boolean (так же, как выражение в условии if). Если он возвращает true, то первый AssignmentExpression оценивается и возвращаемое значение возвращается, в противном случае второй оценивается и возвращается.

ошибка в исходном коде-это дополнительные двоеточия, которые изменяют попытанный условный оператор на ряд операторов с синтаксическими ошибками.


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

первое, что я вижу, что вы ошиблись, - это то, что ваше первое выражение не возвращает логическое или что-то разумное, что может быть преобразовано в логическое. Ваше первое выражение всегда будет возвращать объект jQuery, который не имеет разумной интерпретации как логическое, и то, что он преобразует, вероятно, является неизменная интерпретация. Вам всегда лучше возвращать что-то, что имеет хорошо известную булеву интерпретацию, если ничего другого для удобства чтения.

во-вторых, вы ставите точку с запятой после каждого из ваших выражений, что неправильно. По сути, это говорит "конец конструкции", а также ломает ваш троичный оператор.

в этой ситуации, хотя вы, вероятно, можете сделать это более простым способом. Если вы используете классы и метод toggleClass затем вы можете легко заставить его включать и выключать класс, а затем вы можете поместить свои стили в это определение класса (хвала @yoavmatchulsky за предложение использовать классы там в комментариях).

скрипка этого находится здесь:http://jsfiddle.net/chrisvenus/wSMnV/ (на основе оригинала)


тернарный оператор работает, потому что первая его часть возвращает логическое значение. В вашем случае css-метод jQuery возвращает объект jQuery, что недопустимо для троичной операции.


из того, что вы пытаетесь сделать,тумблер может лучше решить вашу проблему.

EDIT: извините, переключение - это просто видимость, я не думаю, что это поможет вашему переключению цвета bg.

но здесь вы идете:

var box = $("#blackbox");
box.css('background') == 'pink' ? box.css({'background':'black'}) : box.css({'background':'pink'}); 

кроме того, тернарный оператор ожидает выражения, а не операторы. Не используйте точки с запятой, только в конце тройной op.

$("#blackbox").css({'background': 
    $("#blackbox").css('background') === 'pink' ? 'black' : 'pink'});

Как правильно указали другие, первая часть Троицы должна вернуться true или false и в вашем вопросе возвращаемое значение-это объект jQuery.

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

так с CSS:

#blackbox {
    background:pink;
    width:10px;
    height:10px;
}

следующий jQuery перевернет цвет:

var b = $('#blackbox');
b.css('background', (b.css('backgroundColor') === 'rgb(255, 192, 203)' ? 'black' : 'pink'));

демо